Beispiel #1
0
        public override void OnStart(PartModule.StartState state)
        {
            if (state == StartState.Editor)
            {
                return;
            }
            decay_resource = part.Resources[resourceName];
            part.force_activate();
            double time_diff = lastActiveTime - Planetarium.GetUniversalTime();

            if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct))
            {
                density_rat = decay_resource.info.density / PartResourceLibrary.Instance.GetDefinition(decayProduct).density;
            }
            if (time_diff > 0)
            {
                double n_0 = decay_resource.amount;
                decay_resource.amount = n_0 * Math.Exp(-decayConstant * time_diff);
                double n_change = n_0 - decay_resource.amount;
                if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct))
                {
                    ORSHelper.fixedRequestResource(part, decayProduct, -n_change * density_rat);
                }
            }
        }
Beispiel #2
0
        public override void OnFixedUpdate()
        {
            if (scoopIsEnabled)
            {
                string atmospheric_resource_name = ORSAtmosphericResourceHandler.getAtmosphericResourceName(vessel.mainBody.flightGlobalsIndex, currentresource);
                if (atmospheric_resource_name != null)
                {
                    //Common
                    double resourcedensity = PartResourceLibrary.Instance.GetDefinition(atmospheric_resource_name).density;
                    double respcent        = ORSAtmosphericResourceHandler.getAtmosphericResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource);

                    double airdensity = part.vessel.atmDensity / 1000;


                    double powerrequirements = scoopair / 0.15f * ecRequirement;
                    double airspeed          = part.vessel.srf_velocity.magnitude + 40.0;
                    double air = airspeed * airdensity * scoopair / resourcedensity;


                    if (respcent > 0 && vessel.altitude <= ORSHelper.getMaxAtmosphericAltitude(vessel.mainBody))
                    {
                        double scoopedAtm    = air * respcent;
                        float  powerreceived = (float)Math.Max(part.RequestResource("ElectricCharge", powerrequirements * TimeWarp.fixedDeltaTime), 0);
                        float  powerpcnt     = (float)(powerreceived / powerrequirements / TimeWarp.fixedDeltaTime);
                        resflowf = (float)ORSHelper.fixedRequestResource(part, atmospheric_resource_name, -scoopedAtm * powerpcnt * TimeWarp.fixedDeltaTime);

                        resflowf = -resflowf / TimeWarp.fixedDeltaTime;
                    }
                }
            }
        }
Beispiel #3
0
        void OnVesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> change)
        {
            bool shouldReinitialise = false;

            if (change.from == Vessel.Situations.DOCKED)
            {
                shouldReinitialise = true;
            }

            if (change.to == Vessel.Situations.DOCKED)
            {
                shouldReinitialise = true;
            }

            if (shouldReinitialise)
            {
                ORSHelper.removeVesselFromCache(change.host);

                Debug.Log("[KSP Interstellar] GameEventSubscriber - OnVesselSituationChange reinitialising");

                var generators = change.host.FindPartModulesImplementing <FNGenerator>();

                generators.ForEach(g => g.OnStart(PartModule.StartState.Docked));

                var radiators = change.host.FindPartModulesImplementing <FNRadiator>();

                radiators.ForEach(g => g.OnStart(PartModule.StartState.Docked));
            }
        }
Beispiel #4
0
        public void FixedUpdate()
        {
            if (decay_resource == null)
            {
                return;
            }

            if (!HighLogic.LoadedSceneIsFlight)
            {
                return;
            }

            lastActiveTime = Planetarium.GetUniversalTime();

            if (CheatOptions.UnbreakableJoints)
            {
                return;
            }

            double decay_amount = decayConstant * decay_resource.amount * TimeWarp.fixedDeltaTime;

            decay_resource.amount -= decay_amount;

            if (resourceDefinitionsContainDecayProduct)
            {
                ORSHelper.fixedRequestResource(part, decayProduct, -decay_amount * density_rat);
            }
        }
Beispiel #5
0
        public override void OnFixedUpdate()
        {
            if (scoopIsEnabled)
            {
                string atmospheric_resource_name = ORSAtmosphericResourceHandler.getAtmosphericResourceName(vessel.mainBody.flightGlobalsIndex, currentresource);
                if (atmospheric_resource_name != null)
                {
                    double resourcedensity = PartResourceLibrary.Instance.GetDefinition(atmospheric_resource_name).density;
                    double respcent        = ORSAtmosphericResourceHandler.getAtmosphericResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource);
                    //double resourcedensity = PartResourceLibrary.Instance.GetDefinition(PluginHelper.atomspheric_resources_tocollect[currentresource]).density;
                    //double respcent = PluginHelper.getAtmosphereResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource);

                    double airdensity        = part.vessel.atmDensity / 1000;
                    double powerrequirements = scoopair / 0.15f * 6f;

                    double airspeed = part.vessel.srf_velocity.magnitude + 40.0;
                    double air      = airspeed * airdensity * scoopair / resourcedensity;

                    if (respcent > 0 && vessel.altitude <= PluginHelper.getMaxAtmosphericAltitude(vessel.mainBody))
                    {
                        double scoopedAtm = air * respcent;

                        float powerreceived = Math.Max(consumeFNResource(powerrequirements * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES), 0);
                        float powerpcnt     = (float)(powerreceived / powerrequirements / TimeWarp.fixedDeltaTime);

                        //resflowf = (float)part.RequestResource(atmospheric_resource_name, -scoopedAtm * powerpcnt * TimeWarp.fixedDeltaTime);
                        resflowf = (float)ORSHelper.fixedRequestResource(part, atmospheric_resource_name, -scoopedAtm * powerpcnt * TimeWarp.fixedDeltaTime);
                        resflowf = -resflowf / TimeWarp.fixedDeltaTime;
                    }
                }
                else
                {
                }
            }
        }
Beispiel #6
0
        public override void OnStart(PartModule.StartState state)
        {
            if (state == StartState.Editor)
            {
                return;
            }
            decay_resource = part.Resources[resourceName];
            part.force_activate();

            if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct))
            {
                density_rat = decay_resource.info.density / PartResourceLibrary.Instance.GetDefinition(decayProduct).density;
            }

            double time_diff = Planetarium.GetUniversalTime() - lastActiveTime;

            if (time_diff > 0)
            {
                double decay_amount = decayWithProductionRate(time_diff);
                ORSHelper.fixedRequestResource(part, decayProduct, -decay_amount * density_rat);
                decay_resource.amount -= decay_amount;
            }

            lastActiveTime = (float)Planetarium.GetUniversalTime();
        }
        public double ReprocessFuel(double rate)
        {
            if (part.Resources.Contains(InterstellarResourcesConfiguration.Instance.Actinides))
            {
                PartResource actinides            = part.Resources[InterstellarResourcesConfiguration.Instance.Actinides];
                double       new_actinides_amount = Math.Max(actinides.amount - rate, 0);
                double       actinides_change     = actinides.amount - new_actinides_amount;
                actinides.amount = new_actinides_amount;

                double depleted_fuels_change = actinides_change * 0.2;
                depleted_fuels_change = -ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.DepletedFuel, -depleted_fuels_change);

                double sum_useage_per_mw = current_fuel_mode.ReactorFuels.Sum(fuel => fuel.FuelUsePerMJ * fuelUsePerMJMult);

                foreach (ReactorFuel fuel in current_fuel_mode.ReactorFuels)
                {
                    PartResource fuel_resource   = part.Resources[fuel.FuelName];
                    double       fraction        = sum_useage_per_mw > 0.0 ? fuel.FuelUsePerMJ * fuelUsePerMJMult / sum_useage_per_mw : 1;
                    double       new_fuel_amount = Math.Min(fuel_resource.amount + depleted_fuels_change * 4.0 * fraction, fuel_resource.maxAmount);
                    fuel_resource.amount = new_fuel_amount;
                }

                return(actinides_change);
            }
            return(0);
        }
        public override void OnFixedUpdate()
        {
            if (CollectorIsEnabled)
            {
                string atmospheric_resource_name = ORSAtmosphericResourceHandler.getAtmosphericResourceName(vessel.mainBody.flightGlobalsIndex, currentresource);
                if (atmospheric_resource_name != null)
                {
                    //range is 10% of the atmosphere
                    var    range           = ORSHelper.getMaxAtmosphericAltitude(vessel.mainBody) * 1.1;
                    double resourcedensity = PartResourceLibrary.Instance.GetDefinition(atmospheric_resource_name).density;
                    double respcent        = ORSAtmosphericResourceHandler.getAtmosphericResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource);

                    //If we're in the narrow band of the upper atmosphere
                    if (vessel.altitude <= range &&
                        respcent > 0 &&
                        vessel.altitude >= ORSHelper.getMaxAtmosphericAltitude(vessel.mainBody))
                    {
                        /** RAILS **/
                        if (Time.timeSinceLevelLoad < 1.0f || !FlightGlobals.ready)
                        {
                            return;
                        }

                        if (lastUpdateTime == 0.0f)
                        {
                            // Just started running
                            lastUpdateTime = Planetarium.GetUniversalTime();
                            return;
                        }

                        double deltaTime = Math.Min(Planetarium.GetUniversalTime() - lastUpdateTime, Utilities.MaxDeltaTime);
                        lastUpdateTime += deltaTime;
                        /** RAILS **/


                        double powerrequirements = particleRate / 0.15f * ecRequirement;
                        double desiredPower      = powerrequirements * TimeWarp.fixedDeltaTime;
                        double maxPower          = powerrequirements * Math.Max(Utilities.ElectricityMaxDeltaTime, TimeWarp.fixedDeltaTime);
                        var    powerRequested    = Math.Min(desiredPower, maxPower);


                        double particles          = particleRate / resourcedensity;
                        double CollectedParticles = particles * respcent;
                        float  powerreceived      =
                            (float)
                            Math.Max(
                                part.RequestResource("ElectricCharge", powerRequested),
                                0);
                        float powerpcnt = (float)(powerreceived / desiredPower);
                        resflowf =
                            (float)
                            ORSHelper.fixedRequestResource(part, atmospheric_resource_name,
                                                           -CollectedParticles * powerpcnt * deltaTime);

                        resflowf = -resflowf / (float)deltaTime;
                    }
                }
            }
        }
Beispiel #9
0
        public void produceAntimatterFrame(double rate_multiplier)
        {
            double energy_provided    = rate_multiplier * GameConstants.baseAMFPowerConsumption * 1E6f;
            double antimatter_density = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Antimatter).density;
            double antimatter_mass    = energy_provided / GameConstants.warpspeed / GameConstants.warpspeed / 200000.0f / antimatter_density * efficiency;

            current_rate = -ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Antimatter, -antimatter_mass * TimeWarp.fixedDeltaTime) / TimeWarp.fixedDeltaTime;
        }
Beispiel #10
0
        public override void OnFixedUpdate()
        {
            double decay_amount = decayConstant * decay_resource.amount * TimeWarp.fixedDeltaTime;

            decay_resource.amount -= decay_amount;
            if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct))
            {
                ORSHelper.fixedRequestResource(part, decayProduct, -decay_amount);
            }
        }
        public override void OnFixedUpdate()
        {
            drawCount++;
            float lat  = (float)vessel.mainBody.GetLatitude(this.vessel.GetWorldPos3D());
            float flux = VanAllen.getBeltAntiparticles(vessel.mainBody.flightGlobalsIndex, (float)vessel.altitude, lat);

            //part.RequestResource("Antimatter", -flux * TimeWarp.fixedDeltaTime);
            ORSHelper.fixedRequestResource(part, "Antimatter", -flux * TimeWarp.fixedDeltaTime);
            last_active_time  = (float)Planetarium.GetUniversalTime();
            collection_rate_d = flux * 86400;
        }
Beispiel #12
0
        public override void OnFixedUpdate()
        {
            double decay_amount = decayConstant * decay_resource.amount * TimeWarp.fixedDeltaTime;

            decay_resource.amount -= decay_amount;
            if (PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct))
            {
                ORSHelper.fixedRequestResource(part, decayProduct, -decay_amount * density_rat);
            }

            lastActiveTime = (float)Planetarium.GetUniversalTime();
        }
Beispiel #13
0
        protected override double consumeReactorResource(double resource)
        {
            double deuterium_he3_consumption = isupgraded ? resource * GameConstants.antimatter_initiated_upgraded_d_he3_cons_constant : resource * GameConstants.antimatter_initiated_d_he3_cons_constant;
            double un_consumption            = isupgraded ? resource * GameConstants.antimatter_initiated_upgraded_uf4_cons_constant : resource * GameConstants.antimatter_initiated_uf4_cons_constant;
            double antimatter_consumption    = GameConstants.antimatter_initiated_antimatter_cons_constant * resource;

            double delta_deut = deuterium.amount - Math.Max(0, deuterium.amount - deuterium_he3_consumption);
            double delta_he3  = he3.amount - Math.Max(0, he3.amount - deuterium_he3_consumption);
            double delta_un   = un.amount - Math.Max(0, un.amount - un_consumption);
            double delta_amat = ORSHelper.fixedRequestResource(part, "Antimatter", antimatter_consumption);

            deuterium.amount = Math.Max(0, deuterium.amount - deuterium_he3_consumption);
            he3.amount       = Math.Max(0, he3.amount - deuterium_he3_consumption);
            un.amount        = Math.Max(0, un.amount - un_consumption);
            return(resource * Math.Min(delta_deut / deuterium_he3_consumption, Math.Min(delta_he3 / deuterium_he3_consumption, Math.Min(delta_un / un_consumption, delta_amat / antimatter_consumption))));
        }
Beispiel #14
0
        protected override double returnReactorResource(double resource)
        {
            double deuterium_he3_consumption = isupgraded ? resource * GameConstants.antimatter_initiated_upgraded_d_he3_cons_constant : resource * GameConstants.antimatter_initiated_d_he3_cons_constant;
            double un_consumption            = isupgraded ? resource * GameConstants.antimatter_initiated_upgraded_uf4_cons_constant : resource * GameConstants.antimatter_initiated_uf4_cons_constant;
            double antimatter_consumption    = GameConstants.antimatter_initiated_antimatter_cons_constant * resource;

            double delta_deut = Math.Min(deuterium.maxAmount, deuterium.amount + deuterium_he3_consumption) - deuterium.amount;
            double delta_he3  = Math.Min(he3.maxAmount, he3.amount + deuterium_he3_consumption) - he3.amount;
            double delta_un   = Math.Min(un.maxAmount, un.amount + un_consumption) - un.amount;
            double delta_amat = -ORSHelper.fixedRequestResource(part, "Antimatter", -antimatter_consumption);

            deuterium.amount = Math.Min(deuterium.maxAmount, deuterium.amount + deuterium_he3_consumption);
            he3.amount       = Math.Min(he3.maxAmount, he3.amount + deuterium_he3_consumption);
            un.amount        = Math.Min(un.maxAmount, un.amount + un_consumption);

            return(resource);
        }
Beispiel #15
0
        public void performReprocessingFrame(double rate_multiplier)
        {
            List <FNNuclearReactor> nuclear_reactors = vessel.FindPartModulesImplementing <FNNuclearReactor>();
            double remaining_capacity_to_reprocess   = GameConstants.baseReprocessingRate * TimeWarp.fixedDeltaTime / 86400.0 * rate_multiplier;
            double enum_actinides_change             = 0;
            double amount_to_reprocess = 0;

            foreach (FNNuclearReactor nuclear_reactor in nuclear_reactors)
            {
                // reprocess each one
                PartResource actinides = nuclear_reactor.part.Resources["Actinides"];
                if (remaining_capacity_to_reprocess > 0)
                {
                    double new_actinides_amount = Math.Max(actinides.amount - remaining_capacity_to_reprocess, 0);
                    double actinides_change     = actinides.amount - new_actinides_amount;
                    actinides.amount = new_actinides_amount;
                    if (nuclear_reactor.uranium_fuel)
                    {
                        PartResource uf4 = nuclear_reactor.part.Resources["UF4"];
                        double       depleted_fuels_change = actinides_change * 0.2;
                        depleted_fuels_change = -ORSHelper.fixedRequestResource(part, "DepletedFuel", -depleted_fuels_change);
                        double new_uf4_amount = Math.Min(uf4.amount + depleted_fuels_change * 4, uf4.maxAmount);
                        double uf4_change     = new_uf4_amount - uf4.amount;
                        uf4.amount             = new_uf4_amount;
                        enum_actinides_change += depleted_fuels_change * 5;
                    }
                    else
                    {
                        PartResource thf4 = nuclear_reactor.part.Resources["ThF4"];
                        double       depleted_fuels_change = actinides_change * 0.2;
                        depleted_fuels_change = -ORSHelper.fixedRequestResource(part, "DepletedFuel", -depleted_fuels_change);
                        double new_thf4_amount = Math.Min(thf4.amount + depleted_fuels_change * 4, thf4.maxAmount);
                        double thf4_change     = new_thf4_amount - thf4.amount;
                        thf4.amount            = new_thf4_amount;
                        enum_actinides_change += depleted_fuels_change * 5;
                    }
                    remaining_capacity_to_reprocess = Math.Max(0, actinides_change);
                    //enum_actinides_change += actinides_change;
                }
                amount_to_reprocess += actinides.amount;
            }
            remaining_to_reprocess = amount_to_reprocess;
            current_rate           = enum_actinides_change;
        }
Beispiel #16
0
        private void ScoopAthmosphere(double deltaTimeInSeconds, bool offlineCollecting)
        {
            string atmospheric_resource_name = ORSAtmosphericResourceHandler.getAtmosphericResourceName(vessel.mainBody.flightGlobalsIndex, currentresource);

            if (atmospheric_resource_name == null)
            {
                resflowf = 0.0f;
                return;
            }

            double resourcedensity = PartResourceLibrary.Instance.GetDefinition(atmospheric_resource_name).density;
            double respcent        = ORSAtmosphericResourceHandler.getAtmosphericResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource);
            //double resourcedensity = PartResourceLibrary.Instance.GetDefinition(PluginHelper.atomspheric_resources_tocollect[currentresource]).density;
            //double respcent = PluginHelper.getAtmosphereResourceContent(vessel.mainBody.flightGlobalsIndex, currentresource);

            double airdensity        = (part.vessel.atmDensity + PluginHelper.MinAtmosphericAirDensity) / 1000.0;
            double powerrequirements = (scoopair / 0.15f) * 6f * (float)PluginHelper.PowerConsumptionMultiplier;

            double airspeed = part.vessel.srf_velocity.magnitude + 40.0;
            double air      = airspeed * airdensity * scoopair / resourcedensity;

            if (respcent == 0 || vessel.altitude > (PluginHelper.getMaxAtmosphericAltitude(vessel.mainBody) * PluginHelper.MaxAtmosphericAltitudeMult))
            {
                resflowf = 0.0f;
                return;
            }

            double scoopedAtm    = air * respcent;
            float  powerreceived = Math.Max(consumeFNResource(powerrequirements * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES), 0);

            last_power_percentage = offlineCollecting ? last_power_percentage : (float)(powerreceived / powerrequirements / TimeWarp.fixedDeltaTime);
            double resourceChange = scoopedAtm * last_power_percentage * deltaTimeInSeconds;

            if (offlineCollecting)
            {
                string numberformat = resourceChange > 100 ? "0" : "0.00";
                ScreenMessages.PostScreenMessage("Atmospheric Scoop collected " + resourceChange.ToString(numberformat) + " " + atmospheric_resource_name, 10.0f, ScreenMessageStyle.LOWER_CENTER);
            }

            //resflowf = (float)part.RequestResource(atmospheric_resource_name, -scoopedAtm * powerpcnt * TimeWarp.fixedDeltaTime);
            resflowf = (float)ORSHelper.fixedRequestResource(part, atmospheric_resource_name, -resourceChange);
            resflowf = -resflowf / TimeWarp.fixedDeltaTime;
        }
Beispiel #17
0
        public override void OnUpdate()
        {
            if (vessel != null)
            {
                double airdensity = part.vessel.atmDensity;
                double airspeed   = part.vessel.srf_velocity.magnitude + 40.0;
                double air        = airspeed * airdensity * scoopair;


                if (vessel.altitude <= ORSHelper.getMaxAtmosphericAltitude(vessel.mainBody))
                {
                    double scoopedAtm = air;
                    resflowf =
                        (float)
                        ORSHelper.fixedRequestResource(part, intakeResourceStr, -scoopedAtm * TimeWarp.fixedDeltaTime);
                    resflowf = -resflowf / TimeWarp.fixedDeltaTime;
                    resflow  = resflowf.ToString("0.0000");
                }
            }
        }
        public override void OnFixedUpdate()
        {
            if (cryostat_resource != null && cryostat_resource.amount > 0.0)
            {
                double charge = consumeFNResource(powerReqKW / 1000.0 * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES) * 1000.0;
                if (charge <= powerReqKW * TimeWarp.fixedDeltaTime)
                {
                    double rem_charge = powerReqKW * TimeWarp.fixedDeltaTime - charge;
                    charge += ORSHelper.fixedRequestResource(part, "ElectricCharge", rem_charge);
                }
                power_d = charge / TimeWarp.fixedDeltaTime;

                if (charge >= powerReqKW)
                {
                    cryostat_resource.amount = Math.Max(0, cryostat_resource.amount - boilOffRate * TimeWarp.fixedDeltaTime * cryostat_resource.maxAmount);
                }
                else
                {
                    cryostat_resource.amount = Math.Max(0, cryostat_resource.amount - (boilOffRate + boilOffAddition) * TimeWarp.fixedDeltaTime * cryostat_resource.maxAmount * boilOffMultiplier);
                }
            }
        }
        public override void OnStart(PartModule.StartState state)
        {
            if (state == StartState.Editor)
            {
                return;
            }
            this.part.force_activate();

            double now       = Planetarium.GetUniversalTime();
            double time_diff = now - last_active_time;

            if (last_active_time != 0 && vessel.orbit.eccentricity < 1)
            {
                double lat                = vessel.mainBody.GetLatitude(vessel.transform.position);
                double vessel_avg_alt     = (vessel.orbit.ApR + vessel.orbit.PeR) / 2.0f;
                double vessel_inclination = vessel.orbit.inclination;
                float  flux               = (VanAllen.getBeltAntiparticles(vessel.mainBody.flightGlobalsIndex, (float)vessel_avg_alt, (float)vessel_inclination) + VanAllen.getBeltAntiparticles(vessel.mainBody.flightGlobalsIndex, (float)vessel_avg_alt, 0.0f)) / 2.0f;
                //vessel.orbit.
                double antimatter_to_add = time_diff * flux;
                //part.RequestResource("Antimatter", -antimatter_to_add);
                ORSHelper.fixedRequestResource(part, "Antimatter", -antimatter_to_add);
            }
        }
Beispiel #20
0
        public override void OnStart(PartModule.StartState state)
        {
            double time_diff = lastActiveTime - Planetarium.GetUniversalTime();

            if (state == StartState.Editor)
            {
                return;
            }

            if (part.Resources.Contains(resourceName))
            {
                decay_resource = part.Resources[resourceName];
            }
            else
            {
                decay_resource = null;
                return;
            }

            resourceDefinitionsContainDecayProduct = PartResourceLibrary.Instance.resourceDefinitions.Contains(decayProduct);
            if (resourceDefinitionsContainDecayProduct)
            {
                density_rat = decay_resource.info.density / PartResourceLibrary.Instance.GetDefinition(decayProduct).density;
            }

            if (!CheatOptions.UnbreakableJoints && decay_resource != null && time_diff > 0)
            {
                double n_0 = decay_resource.amount;
                decay_resource.amount = n_0 * Math.Exp(-decayConstant * time_diff);
                double n_change = n_0 - decay_resource.amount;

                if (resourceDefinitionsContainDecayProduct)
                {
                    ORSHelper.fixedRequestResource(part, decayProduct, -n_change * density_rat);
                }
            }
        }
Beispiel #21
0
        protected void doPersistentResourceUpdate()
        {
            double now       = Planetarium.GetUniversalTime();
            double time_diff = now - last_active_time;

            foreach (ReactorFuel fuel in current_fuel_mode.ReactorFuels)
            {
                consumeReactorFuel(fuel, time_diff * ongoing_consumption_rate * fuel.FuelUsePerMJ);                                                          // consume fuel
            }
            if (breedtritium)
            {
                tritium_rate = MaximumPower / 1000.0 / GameConstants.tritiumBreedRate;
                PartResourceDefinition lithium_definition = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Lithium);
                PartResourceDefinition tritium_definition = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Tritium);
                List <PartResource>    lithium_resources  = part.GetConnectedResources(InterstellarResourcesConfiguration.Instance.Lithium).ToList();
                List <PartResource>    tritium_resources  = part.GetConnectedResources(InterstellarResourcesConfiguration.Instance.Tritium).ToList();
                double lithium_current_amount             = lithium_resources.Sum(rs => rs.amount);
                double tritium_missing_amount             = tritium_resources.Sum(rs => rs.maxAmount - rs.amount);
                double lithium_to_take = Math.Min(tritium_rate * time_diff * ongoing_consumption_rate, lithium_current_amount);
                double tritium_to_add  = Math.Min(tritium_rate * time_diff * ongoing_consumption_rate, tritium_missing_amount) * lithium_definition.density / tritium_definition.density;;
                ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Lithium, Math.Min(tritium_to_add, lithium_to_take));
                ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Tritium, -Math.Min(tritium_to_add, lithium_to_take));
            }
        }
        public override void OnFixedUpdate()
        {
            if (antimatter != null)
            {
                float mult = 1;
                current_antimatter = (float)antimatter.amount;
                explosion_size     = Mathf.Sqrt(current_antimatter) * 5.0f;
                if (chargestatus > 0 && (current_antimatter > 0.00001 * antimatter.maxAmount))
                {
                    chargestatus -= 1.0f * TimeWarp.fixedDeltaTime;
                }
                if (chargestatus >= GameConstants.MAX_ANTIMATTER_TANK_STORED_CHARGE)
                {
                    mult = 0.5f;
                }
                if (should_charge || (current_antimatter > 0.00001 * antimatter.maxAmount))
                {
                    float charge_to_add = consumeFNResource(mult * 2.0 * chargeNeeded / 1000.0 * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES) * 1000.0f / chargeNeeded;
                    chargestatus += charge_to_add;

                    if (charge_to_add < 2f * TimeWarp.fixedDeltaTime)
                    {
                        float more_charge_to_add = ORSHelper.fixedRequestResource(part, "ElectricCharge", mult * 2 * chargeNeeded * TimeWarp.fixedDeltaTime) / chargeNeeded;
                        charge_to_add += more_charge_to_add;
                        chargestatus  += more_charge_to_add;
                    }

                    if (charge_to_add >= 1f * TimeWarp.fixedDeltaTime)
                    {
                        charging = true;
                    }
                    else
                    {
                        charging = false;
                        if (TimeWarp.CurrentRateIndex > 3 && (current_antimatter > 0.00001 * antimatter.maxAmount))
                        {
                            TimeWarp.SetRate(3, true);
                            ScreenMessages.PostScreenMessage("Cannot Time Warp faster than 50x while Antimatter Tank is Unpowered", 1.0f, ScreenMessageStyle.UPPER_CENTER);
                        }
                    }
                    //print (chargestatus);
                    if (chargestatus <= 0)
                    {
                        chargestatus = 0;
                        if (current_antimatter > 0.00001 * antimatter.maxAmount)
                        {
                            explode_counter++;
                            if (explode_counter > 5)
                            {
                                doExplode();
                            }
                        }
                    }
                    else
                    {
                        explode_counter = 0;
                    }

                    if (chargestatus > GameConstants.MAX_ANTIMATTER_TANK_STORED_CHARGE)
                    {
                        chargestatus = GameConstants.MAX_ANTIMATTER_TANK_STORED_CHARGE;
                    }
                }
                else
                {
                }
            }

            if (exploding && lightGameObject != null)
            {
                if (Mathf.Sqrt(cur_explosion_size) > explosion_size)
                {
                    lightGameObject.collider.enabled = false;
                    //Destroy (lightGameObject);
                }

                cur_explosion_size += TimeWarp.fixedDeltaTime * explosion_size * explosion_size / explosion_time;
                lightGameObject.transform.localScale = new Vector3(Mathf.Sqrt(cur_explosion_size), Mathf.Sqrt(cur_explosion_size), Mathf.Sqrt(cur_explosion_size));
                lightGameObject.light.range          = Mathf.Sqrt(cur_explosion_size) * 15f;
                if (Mathf.Sqrt(cur_explosion_size) > explosion_size)
                {
                    TimeWarp.SetRate(0, true);
                    vessel.GoOffRails();

                    Vessel[] list_of_vessels_to_explode = FlightGlobals.Vessels.ToArray();
                    foreach (Vessel vess_to_explode in list_of_vessels_to_explode)
                    {
                        if (Vector3d.Distance(vess_to_explode.transform.position, vessel.transform.position) <= explosion_size)
                        {
                            if (vess_to_explode.packed == false)
                            {
                                Part[] parts_to_explode = vess_to_explode.Parts.ToArray();
                                foreach (Part part_to_explode in parts_to_explode)
                                {
                                    if (part_to_explode != null)
                                    {
                                        part_to_explode.explode();
                                    }
                                }
                            }
                        }
                    }

                    Part[] explode_parts = vessel.Parts.ToArray();
                    foreach (Part explode_part in explode_parts)
                    {
                        if (explode_part != vessel.rootPart && explode_part != this.part)
                        {
                            explode_part.explode();
                        }
                    }
                    vessel.rootPart.explode();
                    this.part.explode();
                    //	this.part.explode ();
                    //	vessel.rootPart.explode ();
                }
            }
        }
Beispiel #23
0
        public override void OnFixedUpdate()
        {
            base.OnFixedUpdate();
            if (IsEnabled && ThermalPower > 0)
            {
                if (getResourceBarRatio(FNResourceManager.FNRESOURCE_WASTEHEAT) >= 0.95 && canShutdown)
                {
                    deactivate_timer++;
                    if (deactivate_timer > 3)
                    {
                        IsEnabled = false;
                        if (FlightGlobals.ActiveVessel == vessel)
                        {
                            ScreenMessages.PostScreenMessage("Warning Dangerous Overheating Detected: Emergency reactor shutdown occuring NOW!", 5.0f, ScreenMessageStyle.UPPER_CENTER);
                        }
                    }
                    return;
                }
                deactivate_timer = 0;
                double resource_provided = consumeReactorResource(resourceRate * TimeWarp.fixedDeltaTime);
                resource_ratio = resource_provided / resourceRate / TimeWarp.fixedDeltaTime;
                double power_to_supply = Math.Max(ThermalPower * TimeWarp.fixedDeltaTime * resource_ratio, 0);
                double min_throttle    = minimumThrottle;
                if (resource_ratio > 0)
                {
                    min_throttle = min_throttle / resource_ratio;
                }
                if (double.IsNaN(power_to_supply) || double.IsInfinity(power_to_supply))
                {
                    power_to_supply = 0;
                }


                // charged power
                double charged_particles_to_supply = power_to_supply * chargedParticleRatio;
                //double min_charged = convert_charged_to_thermal ? 0 : minimumThrottle;
                double min_charged            = minimumThrottle;
                double charged_power_received = supplyManagedFNResourceWithMinimum(charged_particles_to_supply, min_charged, FNResourceManager.FNRESOURCE_CHARGED_PARTICLES);
                if (chargedParticleRatio > 0)
                {
                    charged_power_ratio = charged_power_received / ThermalPower / chargedParticleRatio / TimeWarp.fixedDeltaTime;
                }
                else
                {
                    charged_power_ratio = 0;
                }
                //double converted_thermal_power = convert_charged_to_thermal ? (charged_particles_to_supply - charged_power_received) : 0;
                double converted_thermal_power = 0;

                // thermal power
                //min_throttle = Math.Max(min_throttle, charged_power_ratio);
                double thermal_power_to_supply = power_to_supply * (1.0 - chargedParticleRatio);
                double thermal_power_received  = supplyManagedFNResourceWithMinimum(thermal_power_to_supply + converted_thermal_power, min_throttle, FNResourceManager.FNRESOURCE_THERMALPOWER);
                total_power = (thermal_power_received + charged_power_received);
                if (getResourceBarRatio(FNResourceManager.FNRESOURCE_WASTEHEAT) < 0.95)
                {
                    supplyFNResource(total_power, FNResourceManager.FNRESOURCE_WASTEHEAT); // generate heat that must be dissipated
                }
                if ((1 - chargedParticleRatio) > 0)
                {
                    thermal_power_ratio = thermal_power_received / ThermalPower / (1 - chargedParticleRatio) / TimeWarp.fixedDeltaTime;
                }
                else
                {
                    thermal_power_ratio = 0;
                }

                // total power
                total_power_ratio        = total_power / ThermalPower / TimeWarp.fixedDeltaTime;
                ongoing_consumption_rate = (float)total_power_ratio;
                double return_ratio      = 1 - total_power_ratio;
                double resource_returned = returnReactorResource(resource_provided * return_ratio);
                powerPcnt    = (float)(resource_ratio * 100.0 * total_power_ratio);
                tritium_rate = (float)(thermal_power_received / TimeWarp.fixedDeltaTime / 1000.0f / GameConstants.tritiumBreedRate) * (1 - chargedParticleRatio);
                if (breedtritium)
                {
                    double lith_rate = tritium_rate * TimeWarp.fixedDeltaTime;
                    //double lith_used = part.RequestResource("Lithium", lith_rate);
                    double lith_used = ORSHelper.fixedRequestResource(part, "Lithium", lith_rate);
                    tritium_produced_f = (float)(-ORSHelper.fixedRequestResource(part, "Tritium", -lith_used) / TimeWarp.fixedDeltaTime);
                    //tritium_produced_f = (float) (-part.RequestResource("Tritium", -lith_used) / TimeWarp.fixedDeltaTime);
                    if (tritium_produced_f <= 0)
                    {
                        breedtritium = false;
                    }
                }
                if (Planetarium.GetUniversalTime() != 0)
                {
                    last_active_time = (float)Planetarium.GetUniversalTime();
                }
                if (resource_ratio < minimumThrottle * 0.99 && isNeutronRich() && canShutdown)
                {
                    IsEnabled = false;
                }
                decay_products_ongoing = false;
            }
            else
            {
                if (ThermalPower > 0 && Planetarium.GetUniversalTime() - last_active_time <= 3 * 86400 && getIsNuclear())
                {
                    double daughter_half_life     = 86400.0 / 24.0 * 9.0;
                    double time_t                 = Planetarium.GetUniversalTime() - last_active_time;
                    double power_fraction         = 0.1 * Math.Exp(-time_t / daughter_half_life);
                    double power_to_supply        = Math.Max(ThermalPower * TimeWarp.fixedDeltaTime * power_fraction, 0);
                    double thermal_power_received = supplyManagedFNResourceWithMinimum(power_to_supply, 1.0, FNResourceManager.FNRESOURCE_THERMALPOWER);
                    supplyFNResource(thermal_power_received, FNResourceManager.FNRESOURCE_WASTEHEAT); // generate heat that must be dissipated
                    thermal_power_ratio      = thermal_power_received / ThermalPower / TimeWarp.fixedDeltaTime;
                    total_power_ratio        = thermal_power_received / ThermalPower / TimeWarp.fixedDeltaTime;
                    charged_power_ratio      = 0;
                    powerPcnt                = (float)(100.0 * total_power_ratio);
                    ongoing_consumption_rate = (float)total_power_ratio;
                    decay_products_ongoing   = true;
                }
                else
                {
                    decay_products_ongoing = false;
                }
            }
        }
        public override void OnFixedUpdate()
        {
            float global_rate_multipliers = 1;

            crew_capacity_ratio     = ((float)part.protoModuleCrew.Count) / ((float)part.CrewCapacity);
            global_rate_multipliers = global_rate_multipliers * crew_capacity_ratio;

            if (ResearchAndDevelopment.Instance != null)
            {
                if (!double.IsNaN(science_awaiting_addition) && !double.IsInfinity(science_awaiting_addition) && science_awaiting_addition > 0)
                {
                    ResearchAndDevelopment.Instance.Science = ResearchAndDevelopment.Instance.Science + (float)science_awaiting_addition;
                    ScreenMessages.PostScreenMessage(science_awaiting_addition.ToString("0") + " science has been added to the R&D centre.", 2.5f, ScreenMessageStyle.UPPER_CENTER);
                    science_awaiting_addition = 0;
                }
            }

            if (IsEnabled)
            {
                if (active_mode == 0)   // Research
                {
                    double electrical_power_provided = consumeFNResource(GameConstants.basePowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES);
                    electrical_power_ratio  = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / GameConstants.basePowerConsumption);
                    global_rate_multipliers = global_rate_multipliers * electrical_power_ratio;
                    float stupidity = 0;
                    foreach (ProtoCrewMember proto_crew_member in part.protoModuleCrew)
                    {
                        stupidity += proto_crew_member.stupidity;
                    }
                    stupidity = 1.5f - stupidity / 2.0f;
                    float altitude_multiplier = (float)(vessel.altitude / (vessel.mainBody.Radius));
                    altitude_multiplier = Math.Max(altitude_multiplier, 1);
                    science_rate_f      = (float)(GameConstants.baseScienceRate * PluginHelper.getScienceMultiplier(vessel.mainBody.flightGlobalsIndex, vessel.LandedOrSplashed) / 86400.0f * global_rate_multipliers * stupidity / (Mathf.Sqrt(altitude_multiplier)));
                    if (ResearchAndDevelopment.Instance != null)
                    {
                        if (!double.IsNaN(science_rate_f) && !double.IsInfinity(science_rate_f))
                        {
                            ResearchAndDevelopment.Instance.Science = ResearchAndDevelopment.Instance.Science + science_rate_f * TimeWarp.fixedDeltaTime;
                        }
                    }
                }
                else if (active_mode == 1)     // Fuel Reprocessing
                {
                    double electrical_power_provided = consumeFNResource(GameConstants.basePowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES);
                    electrical_power_ratio  = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / GameConstants.basePowerConsumption);
                    global_rate_multipliers = global_rate_multipliers * electrical_power_ratio;
                    reprocessor.performReprocessingFrame(global_rate_multipliers);
                    if (reprocessor.getActinidesRemovedPerHour() > 0)
                    {
                        reprocessing_rate_f = (float)(reprocessor.getRemainingAmountToReprocess() / reprocessor.getActinidesRemovedPerHour());
                    }
                    else
                    {
                        IsEnabled = false;
                    }
                }
                else if (active_mode == 2)     //Antimatter
                {
                    double electrical_power_provided = consumeFNResource(GameConstants.baseAMFPowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES);
                    electrical_power_ratio  = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / GameConstants.baseAMFPowerConsumption);
                    global_rate_multipliers = crew_capacity_ratio * electrical_power_ratio;
                    anti_factory.produceAntimatterFrame(global_rate_multipliers);
                    antimatter_rate_f = (float)anti_factory.getAntimatterProductionRate();
                }
                else if (active_mode == 3)
                {
                    IsEnabled = false;
                }
                else if (active_mode == 4)     // Centrifuge
                {
                    if (vessel.Splashed)
                    {
                        float electrical_power_provided = consumeFNResource(GameConstants.baseCentriPowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES);
                        electrical_power_ratio  = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / GameConstants.baseCentriPowerConsumption);
                        global_rate_multipliers = global_rate_multipliers * electrical_power_ratio;
                        float deut_produced = (float)(global_rate_multipliers * GameConstants.deuterium_timescale * GameConstants.deuterium_abudance * 1000.0f);
                        deut_rate_f = -ORSHelper.fixedRequestResource(part, "Deuterium", -deut_produced * TimeWarp.fixedDeltaTime) / TimeWarp.fixedDeltaTime;
                    }
                    else
                    {
                        ScreenMessages.PostScreenMessage("You must be splashed down to perform this activity.", 5.0f, ScreenMessageStyle.UPPER_CENTER);
                        IsEnabled = false;
                    }
                }

                if (electrical_power_ratio <= 0)
                {
                    deut_rate_f         = 0;
                    electrolysis_rate_f = 0;
                    science_rate_f      = 0;
                    antimatter_rate_f   = 0;
                    reprocessing_rate_f = 0;
                }

                last_active_time = (float)Planetarium.GetUniversalTime();
            }
            else
            {
            }
        }
Beispiel #25
0
        public override void OnFixedUpdate()
        {
            float global_rate_multipliers = 1;

            crew_capacity_ratio     = ((float)part.protoModuleCrew.Count) / ((float)part.CrewCapacity);
            global_rate_multipliers = global_rate_multipliers * crew_capacity_ratio;

            if (!IsEnabled)
            {
                return;
            }

            if (active_mode == 0)  // Research
            {
                double electrical_power_provided = consumeFNResource(powerReqMult * PluginHelper.BasePowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES);
                electrical_power_ratio  = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / PluginHelper.BasePowerConsumption / powerReqMult);
                global_rate_multipliers = global_rate_multipliers * electrical_power_ratio;

                float kerbalScienceSkillFactor = part.protoModuleCrew.Sum(proto_crew_member => GetKerbalScienceFactor(proto_crew_member) / 2f);
                float altitude_multiplier      = Math.Max((float)(vessel.altitude / (vessel.mainBody.Radius)), 1);

                science_rate_f = (float)(kerbalScienceSkillFactor * GameConstants.baseScienceRate * PluginHelper.getScienceMultiplier(vessel) //PluginHelper.getScienceMultiplier(vessel.mainBody.flightGlobalsIndex, vessel.LandedOrSplashed)
                                         / GameConstants.EARH_DAY_SECONDS * global_rate_multipliers
                                         / (Mathf.Sqrt(altitude_multiplier)));

                if (ResearchAndDevelopment.Instance != null && !double.IsNaN(science_rate_f) && !double.IsInfinity(science_rate_f))
                {
                    //ResearchAndDevelopment.Instance.Science = ResearchAndDevelopment.Instance.Science + science_rate_f * TimeWarp.fixedDeltaTime;
                    science_to_add += science_rate_f * TimeWarp.fixedDeltaTime;
                }
            }
            else if (active_mode == 1) // Fuel Reprocessing
            {
                double electrical_power_provided = consumeFNResource(powerReqMult * PluginHelper.BasePowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES);
                electrical_power_ratio  = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / PluginHelper.BasePowerConsumption / powerReqMult);
                global_rate_multipliers = global_rate_multipliers * electrical_power_ratio;
                reprocessor.UpdateFrame(global_rate_multipliers, true);

                if (reprocessor.getActinidesRemovedPerHour() > 0)
                {
                    reprocessing_rate_f = (float)(reprocessor.getRemainingAmountToReprocess() / reprocessor.getActinidesRemovedPerHour());
                }
                else
                {
                    IsEnabled = false;
                }
            }
            else if (active_mode == 2) //Antimatter
            {
                double electrical_power_provided = consumeFNResource(powerReqMult * PluginHelper.BaseAMFPowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES);
                electrical_power_ratio  = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / PluginHelper.BaseAMFPowerConsumption / powerReqMult);
                global_rate_multipliers = crew_capacity_ratio * electrical_power_ratio;
                anti_factory.produceAntimatterFrame(global_rate_multipliers);
                antimatter_rate_f = (float)anti_factory.getAntimatterProductionRate();
            }
            else if (active_mode == 3)
            {
                IsEnabled = false;
            }
            else if (active_mode == 4) // Centrifuge
            {
                if (vessel.Splashed)
                {
                    float electrical_power_provided = consumeFNResource(powerReqMult * PluginHelper.BaseCentriPowerConsumption * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES);
                    electrical_power_ratio  = (float)(electrical_power_provided / TimeWarp.fixedDeltaTime / PluginHelper.BaseCentriPowerConsumption / powerReqMult);
                    global_rate_multipliers = global_rate_multipliers * electrical_power_ratio;
                    float deut_produced = (float)(global_rate_multipliers * GameConstants.deuterium_timescale * GameConstants.deuterium_abudance * 1000.0f);
                    deut_rate_f = -ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Deuterium, -deut_produced * TimeWarp.fixedDeltaTime) / TimeWarp.fixedDeltaTime;
                }
                else
                {
                    ScreenMessages.PostScreenMessage("You must be splashed down to perform this activity.", 5.0f, ScreenMessageStyle.UPPER_CENTER);
                    IsEnabled = false;
                }
            }

            if (electrical_power_ratio <= 0)
            {
                deut_rate_f         = 0;
                electrolysis_rate_f = 0;
                science_rate_f      = 0;
                antimatter_rate_f   = 0;
                reprocessing_rate_f = 0;
            }

            last_active_time = (float)Planetarium.GetUniversalTime();
        }
Beispiel #26
0
        public override void OnFixedUpdate()
        {
            decay_ongoing = false;
            base.OnFixedUpdate();
            if (IsEnabled && MaximumPower > 0)
            {
                if (reactorIsOverheating())
                {
                    if (FlightGlobals.ActiveVessel == vessel)
                    {
                        ScreenMessages.PostScreenMessage("Warning Dangerous Overheating Detected: Emergency reactor shutdown occuring NOW!", 5.0f, ScreenMessageStyle.UPPER_CENTER);
                    }
                    IsEnabled = false;
                    return;
                }

                // Max Power
                double max_power_to_supply = Math.Max(MaximumPower * TimeWarp.fixedDeltaTime, 0);
                double fuel_ratio          = Math.Min(current_fuel_mode.ReactorFuels.Min(fuel => getFuelAvailability(fuel) / fuel.GetFuelUseForPower(FuelEfficiency, max_power_to_supply)), 1.0);
                double min_throttle        = fuel_ratio > 0 ? minimumThrottle / fuel_ratio : 1;
                max_power_to_supply = max_power_to_supply * fuel_ratio;
                // Charged Power
                double max_charged_to_supply       = Math.Max(MaximumChargedPower * TimeWarp.fixedDeltaTime, 0) * fuel_ratio;
                double charged_particles_to_supply = max_charged_to_supply;
                double charged_power_received      = supplyManagedFNResourceWithMinimum(charged_particles_to_supply, minimumThrottle, FNResourceManager.FNRESOURCE_CHARGED_PARTICLES);
                double charged_power_ratio         = ChargedParticleRatio > 0 ? charged_power_received / max_charged_to_supply : 0;
                ongoing_charged_power_f = (float)(charged_power_received / TimeWarp.fixedDeltaTime);
                // Thermal Power
                double max_thermal_to_supply   = Math.Max(MaximumThermalPower * TimeWarp.fixedDeltaTime, 0) * fuel_ratio;
                double thermal_power_to_supply = max_thermal_to_supply;
                double thermal_power_received  = supplyManagedFNResourceWithMinimum(thermal_power_to_supply, min_throttle, FNResourceManager.FNRESOURCE_THERMALPOWER);
                double thermal_power_ratio     = (1 - ChargedParticleRatio) > 0 ? thermal_power_received / max_thermal_to_supply : 0;
                ongoing_thermal_power_f = (float)(thermal_power_received / TimeWarp.fixedDeltaTime);
                // Total
                double total_power_received = thermal_power_received + charged_power_received;
                total_power_per_frame = total_power_received;
                double total_power_ratio = total_power_received / MaximumPower / TimeWarp.fixedDeltaTime;
                ongoing_consumption_rate = (float)total_power_ratio;

                foreach (ReactorFuel fuel in current_fuel_mode.ReactorFuels)
                {
                    consumeReactorFuel(fuel, total_power_received * fuel.FuelUsePerMJ);                                                          // consume fuel
                }
                ongoing_total_power_f = ongoing_charged_power_f + ongoing_thermal_power_f;
                // Waste Heat
                supplyFNResource(total_power_received, FNResourceManager.FNRESOURCE_WASTEHEAT); // generate heat that must be dissipated
                //
                powerPcnt = 100.0 * total_power_ratio;

                if (min_throttle > 1.05)
                {
                    IsEnabled = false;
                }
                if (breedtritium)
                {
                    PartResourceDefinition lithium_def = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Lithium);
                    PartResourceDefinition tritium_def = PartResourceLibrary.Instance.GetDefinition(InterstellarResourcesConfiguration.Instance.Tritium);
                    double breed_rate       = thermal_power_received / TimeWarp.fixedDeltaTime / 100000.0 / GameConstants.tritiumBreedRate;
                    double lith_rate        = breed_rate * TimeWarp.fixedDeltaTime / lithium_def.density;
                    double lith_used        = ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Lithium, lith_rate);
                    double lt_density_ratio = lithium_def.density / tritium_def.density;
                    tritium_produced_f = (float)(-ORSHelper.fixedRequestResource(part, InterstellarResourcesConfiguration.Instance.Tritium, -lith_used * 3.0 / 7.0 * lt_density_ratio) / TimeWarp.fixedDeltaTime);
                    if (tritium_produced_f <= 0)
                    {
                        breedtritium = false;
                    }
                }

                if (Planetarium.GetUniversalTime() != 0)
                {
                    last_active_time = (float)(Planetarium.GetUniversalTime());
                }
            }
            else if (MaximumPower > 0 && Planetarium.GetUniversalTime() - last_active_time <= 3 * 86400 && IsNuclear)
            {
                double daughter_half_life     = 86400.0 / 24.0 * 9.0;
                double time_t                 = Planetarium.GetUniversalTime() - last_active_time;
                double power_fraction         = 0.1 * Math.Exp(-time_t / daughter_half_life);
                double power_to_supply        = Math.Max(MaximumPower * TimeWarp.fixedDeltaTime * power_fraction, 0);
                double thermal_power_received = supplyManagedFNResourceWithMinimum(power_to_supply, 1.0, FNResourceManager.FNRESOURCE_THERMALPOWER);
                double total_power_ratio      = thermal_power_received / MaximumPower / TimeWarp.fixedDeltaTime;
                ongoing_consumption_rate = (float)total_power_ratio;
                supplyFNResource(thermal_power_received, FNResourceManager.FNRESOURCE_WASTEHEAT); // generate heat that must be dissipated
                powerPcnt     = 100.0 * total_power_ratio;
                decay_ongoing = true;
            }
            else
            {
                powerPcnt = 0;
            }
        }
Beispiel #27
0
        // the main collecting function
        private void CollectRegolith(double deltaTimeInSeconds, bool offlineCollecting)
        {
            //Debug.Log("Inside Collect function.");
            //dConcentrationRegolith = CalculateRegolithConcentration(FlightGlobals.currentMainBody.position, localStar.transform.position, vessel.altitude);
            dConcentrationRegolith = GetFinalConcentration();

            string strRegolithResourceName = InterstellarResourcesConfiguration.Instance.Regolith;
            double dPowerRequirementsMW    = (double)PluginHelper.PowerConsumptionMultiplier * mwRequirements; // change the mwRequirements number in part config to change the power consumption

            // gets density of the regolith resource
            dRegolithDensity = PartResourceLibrary.Instance.GetDefinition(strRegolithResourceName).density;

            var partsThatContainRegolith = part.GetConnectedResources(strRegolithResourceName);

            dRegolithSpareCapacity = partsThatContainRegolith.Sum(r => r.maxAmount - r.amount);

            if (offlineCollecting)
            {
                dConcentrationRegolith = dLastRegolithConcentration; // if resolving offline collection, pass the saved value, because OnStart doesn't resolve the above function CalculateRegolithConcentration correctly
            }



            if (dConcentrationRegolith > 0 && (dRegolithSpareCapacity > 0))
            {
                // calculate available power
                double dPowerReceivedMW           = Math.Max((double)consumeFNResource(dPowerRequirementsMW * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES), 0);
                double dNormalisedRevievedPowerMW = dPowerReceivedMW / TimeWarp.fixedDeltaTime;

                // if power requirement sufficiently low, retreive power from KW source
                if (dPowerRequirementsMW < 2 && dNormalisedRevievedPowerMW <= dPowerRequirementsMW)
                {
                    double dRequiredKW = (dPowerRequirementsMW - dNormalisedRevievedPowerMW) * 1000;
                    double dReceivedKW = ORSHelper.fixedRequestResource(part, FNResourceManager.STOCK_RESOURCE_ELECTRICCHARGE, dRequiredKW * TimeWarp.fixedDeltaTime);
                    dPowerReceivedMW += (dReceivedKW / 1000);
                }

                dLastPowerPercentage = offlineCollecting ? dLastPowerPercentage : (float)(dPowerReceivedMW / dPowerRequirementsMW / TimeWarp.fixedDeltaTime);

                // show in GUI
                strCollectingStatus = "Collecting regolith";
            }

            else
            {
                dLastPowerPercentage = 0;
                dPowerRequirementsMW = 0;
            }

            // set the GUI string to state the number of KWs received if the MW requirements were lower than 2, otherwise in MW
            strReceivedPower = dPowerRequirementsMW < 2
                ? (dLastPowerPercentage * dPowerRequirementsMW * 1000).ToString("0.0") + " KW / " + (dPowerRequirementsMW * 1000).ToString("0.0") + " KW"
                : (dLastPowerPercentage * dPowerRequirementsMW).ToString("0.0") + " MW / " + dPowerRequirementsMW.ToString("0.0") + " MW";

            /** The first important bit.
             * This determines how much solar wind will be collected. Can be tweaked in part configs by changing the collector's effectiveness.
             * */
            double dResourceChange = (dConcentrationRegolith * drillSize * dRegolithDensity) * effectiveness * dLastPowerPercentage * deltaTimeInSeconds;

            // if the vessel has been out of focus, print out the collected amount for the player
            if (offlineCollecting)
            {
                string strNumberFormat = dResourceChange > 100 ? "0" : "0.00";
                // let the player know that offline collecting worked
                ScreenMessages.PostScreenMessage("The Regolith Drill collected " + dResourceChange.ToString(strNumberFormat) + " units of " + strRegolithResourceName, 10.0f, ScreenMessageStyle.LOWER_CENTER);
            }

            // this is the second important bit - do the actual change of the resource amount in the vessel
            dResourceFlow = (float)ORSHelper.fixedRequestResource(part, strRegolithResourceName, -dResourceChange);
            dResourceFlow = -dResourceFlow / TimeWarp.fixedDeltaTime;

            /* This takes care of wasteheat production (but takes into account if waste heat mechanics weren't disabled).
             * It's affected by two properties of the drill part - its power requirements and waste heat production percentage.
             * More power hungry drills will produce more heat. More effective drills will produce less heat. More effective power hungry drills should produce
             * less heat than less effective power hungry drills. This should allow us to bring some variety into parts, if we want to.
             */

            if (!CheatOptions.IgnoreMaxTemperature)                                                                                 // is this player not using no-heat cheat mode?
            {
                dTotalWasteHeatProduction = dPowerRequirementsMW * wasteHeatModifier;                                               // calculate amount of heat to be produced
                supplyFNResourceFixed(dTotalWasteHeatProduction * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_WASTEHEAT); // push the heat onto them
            }
        }
        // the main collecting function
        private void CollectSolarWind(double deltaTimeInSeconds, bool offlineCollecting)
        {
            dConcentrationSolarWind = CalculateSolarWindConcentration(part.vessel.solarFlux);

            string strSolarWindResourceName = InterstellarResourcesConfiguration.Instance.SolarWind;
            double dPowerRequirementsMW     = (double)PluginHelper.PowerConsumptionMultiplier * mwRequirements; // change the mwRequirements number in part config to change the power consumption

            // checks for free space in solar wind 'tanks'
            dSolarWindSpareCapacity = part.GetResourceSpareCapacity(strSolarWindResourceName);

            // gets density of the solar wind resource
            dSolarWindDensity = PartResourceLibrary.Instance.GetDefinition(strSolarWindResourceName).density;

            if (dConcentrationSolarWind > 0 && (dSolarWindSpareCapacity > 0))
            {
                // calculate available power
                double dPowerReceivedMW           = Math.Max((double)consumeFNResource(dPowerRequirementsMW * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES), 0);
                double dNormalisedRevievedPowerMW = dPowerReceivedMW / TimeWarp.fixedDeltaTime;

                // if power requirement sufficiently low, retreive power from KW source
                if (dPowerRequirementsMW < 2 && dNormalisedRevievedPowerMW <= dPowerRequirementsMW)
                {
                    double dRequiredKW = (dPowerRequirementsMW - dNormalisedRevievedPowerMW) * 1000;
                    double dReceivedKW = ORSHelper.fixedRequestResource(part, FNResourceManager.STOCK_RESOURCE_ELECTRICCHARGE, dRequiredKW * TimeWarp.fixedDeltaTime);
                    dPowerReceivedMW += (dReceivedKW / 1000);
                }

                fLastPowerPercentage = offlineCollecting ? fLastPowerPercentage : (float)(dPowerReceivedMW / dPowerRequirementsMW / TimeWarp.fixedDeltaTime);

                // show in GUI
                strCollectingStatus = "Collecting solar wind";
            }
            else
            {
                fLastPowerPercentage = 0;
                dPowerRequirementsMW = 0;
            }

            // set the GUI string to state the number of KWs received if the MW requirements were lower than 2, otherwise in MW
            strReceivedPower = dPowerRequirementsMW < 2
                ? (fLastPowerPercentage * dPowerRequirementsMW * 1000).ToString("0.0") + " KW / " + (dPowerRequirementsMW * 1000).ToString("0.0") + " KW"
                : (fLastPowerPercentage * dPowerRequirementsMW).ToString("0.0") + " MW / " + dPowerRequirementsMW.ToString("0.0") + " MW";


            /** The first important bit.
             * This determines how much solar wind will be collected. Can be tweaked in part configs by changing the collector's effectiveness.
             * */
            double dResourceChange = (dConcentrationSolarWind * surfaceArea * dSolarWindDensity) * effectiveness * fLastPowerPercentage * deltaTimeInSeconds;


            // if the vessel has been out of focus, print out the collected amount for the player
            if (offlineCollecting)
            {
                string strNumberFormat = dResourceChange > 100 ? "0" : "0.00";
                ScreenMessages.PostScreenMessage("The Solar Wind Collector collected " + dResourceChange.ToString(strNumberFormat) + " units of " + strSolarWindResourceName, 10.0f, ScreenMessageStyle.LOWER_CENTER);
            }

            // this is the second important bit - do the actual change of the resource amount in the vessel
            fResourceFlow = (float)ORSHelper.fixedRequestResource(part, strSolarWindResourceName, -dResourceChange);
            fResourceFlow = -fResourceFlow / TimeWarp.fixedDeltaTime;
        }
Beispiel #29
0
        public override void OnStart(PartModule.StartState state)
        {
            String[] resources_to_supply = { FNResourceManager.FNRESOURCE_THERMALPOWER, FNResourceManager.FNRESOURCE_WASTEHEAT, FNResourceManager.FNRESOURCE_CHARGED_PARTICLES };
            this.resources_to_supply = resources_to_supply;
            //name_to_use = originalName;
            base.OnStart(state);

            Actions["ActivateReactorAction"].guiName   = Events["ActivateReactor"].guiName = String.Format("Activate Reactor");
            Actions["DeactivateReactorAction"].guiName = Events["DeactivateReactor"].guiName = String.Format("Deactivate Reactor");
            Actions["ToggleReactorAction"].guiName     = String.Format("Toggle Reactor");

            if (state == StartState.Editor)
            {
                if (startDisabled)
                {
                    Events["ActivateReactorVAB"].guiActiveEditor   = true;
                    Events["DeactivateReactorVAB"].guiActiveEditor = false;
                }
                if (hasTechsRequiredToUpgrade())
                {
                    isupgraded = true;
                    upgradePartModule();
                }
                return;
            }

            if (hasTechsRequiredToUpgrade())
            {
                hasrequiredupgrade = true;
            }

            if (startDisabled)
            {
                last_active_time = (float)(Planetarium.GetUniversalTime() - 4.0 * 86400.0);
                IsEnabled        = false;
                startDisabled    = false;
            }

            anim = part.FindModelAnimators(animName).FirstOrDefault();
            if (anim != null)
            {
                anim [animName].layer = 1;
                if (!IsEnabled)
                {
                    anim [animName].normalizedTime = 1f;
                    anim [animName].speed          = -1f;
                }
                else
                {
                    anim [animName].normalizedTime = 0f;
                    anim [animName].speed          = 1f;
                }
                anim.Play();
            }

            if (IsEnabled && last_active_time > 0)
            {
                double now              = Planetarium.GetUniversalTime();
                double time_diff        = now - last_active_time;
                double resource_to_take = consumeReactorResource(resourceRate * time_diff * ongoing_consumption_rate);
                if (breedtritium)
                {
                    tritium_rate = (float)(ThermalPower / 1000.0f / GameConstants.tritiumBreedRate);
                    List <PartResource> lithium_resources = new List <PartResource>();
                    part.GetConnectedResources(PartResourceLibrary.Instance.GetDefinition("Lithium").id, lithium_resources);
                    double lithium_current_amount = 0;
                    foreach (PartResource lithium_resource in lithium_resources)
                    {
                        lithium_current_amount += lithium_resource.amount;
                    }

                    List <PartResource> tritium_resources = new List <PartResource>();
                    part.GetConnectedResources(PartResourceLibrary.Instance.GetDefinition("Tritium").id, tritium_resources);
                    double tritium_missing_amount = 0;
                    foreach (PartResource tritium_resource in tritium_resources)
                    {
                        tritium_missing_amount += tritium_resource.maxAmount - tritium_resource.amount;
                    }

                    double lithium_to_take = Math.Min(tritium_rate * time_diff * ongoing_consumption_rate, lithium_current_amount);
                    double tritium_to_add  = Math.Min(tritium_rate * time_diff * ongoing_consumption_rate, tritium_missing_amount);
                    ORSHelper.fixedRequestResource(part, "Lithium", Math.Min(tritium_to_add, lithium_to_take));
                    ORSHelper.fixedRequestResource(part, "Tritium", -Math.Min(tritium_to_add, lithium_to_take));
                }
            }
            this.part.force_activate();
        }
Beispiel #30
0
        public JsonResult SaveOrsObligation(FormCollection collection)
        {
            Int32         id      = Convert.ToInt32(collection.Get("ID"));
            String        data    = collection.Get("data");
            Int32         line_id = 0;
            List <Object> list    = JsonConvert.DeserializeObject <List <Object> >(data);

            foreach (Object s in list)
            {
                try
                {
                    dynamic sb             = JsonConvert.DeserializeObject <dynamic>(s.ToString());
                    String  expenese_title = (String)sb.expense_title;
                    var     uacs           = db.uacs.Where(p => p.Title == expenese_title).FirstOrDefault();
                    if (uacs != null)
                    {
                        line_id = Convert.ToInt32(sb.ID);
                        var ors_uacs = db.ors_expense_codes.Where(p => p.ID == line_id).FirstOrDefault();

                        if (User.IsInRole("Admin") || User.IsInRole("Employee"))
                        {
                            ors_uacs.uacs = sb.expense_title;

                            try { ors_uacs.amount = Convert.ToDouble(sb.amount); } catch { ors_uacs.amount = 0.00; }
                            try { ors_uacs.NetAmount = Convert.ToDouble(sb.NetAmount); } catch { ors_uacs.NetAmount = 0.00; }
                            try { ors_uacs.TaxAmount = Convert.ToDouble(sb.TaxAmount); } catch { ors_uacs.TaxAmount = 0.00; }
                            try { ors_uacs.Others = Convert.ToDouble(sb.Others); } catch { ors_uacs.Others = 0.00; }
                        }
                        else if (User.IsInRole("Cashier"))
                        {
                            try { ors_uacs.NetAmount = Convert.ToDouble(sb.NetAmount); } catch { ors_uacs.NetAmount = 0.00; }
                            try { ors_uacs.TaxAmount = Convert.ToDouble(sb.TaxAmount); } catch { ors_uacs.TaxAmount = 0.00; }
                            try { ors_uacs.Others = Convert.ToDouble(sb.Others); } catch { ors_uacs.Others = 0.00; }
                        }

                        try { db.SaveChanges(); } catch { }
                    }
                }
                catch (Exception ex)
                {
                    dynamic sb = JsonConvert.DeserializeObject <dynamic>(s.ToString());
                    try
                    {
                        String expenese_title = (String)sb.expense_title;
                        var    uacs           = db.uacs.Where(p => p.Title == expenese_title).FirstOrDefault();
                        if (uacs != null)
                        {
                            if (User.IsInRole("Admin") || User.IsInRole("Cashier"))
                            {
                                var uacs_exist = (from exist in db.ors_expense_codes where exist.uacs == expenese_title && exist.ors_obligation == id select exist).ToList();
                                if (uacs_exist.Count <= 0)
                                {
                                    ORS_EXPENSE_CODES oec = new ORS_EXPENSE_CODES();
                                    oec.uacs           = sb.expense_title;
                                    oec.ors_obligation = id;
                                    try { oec.amount = Convert.ToDouble(sb.amount); } catch { oec.amount = 0.00; }
                                    try { oec.TaxAmount = Convert.ToDouble(sb.TaxAmount); } catch { oec.TaxAmount = 0.00; }
                                    try { oec.NetAmount = Convert.ToDouble(sb.NetAmount); } catch { oec.NetAmount = 0.00; }
                                    try { oec.Others = Convert.ToDouble(sb.Others); } catch { oec.Others = 0.00; }
                                    db.ors_expense_codes.Add(oec);
                                    db.SaveChanges();

                                    ORSHelper.InsertORSNo(id);

                                    var ors_allotments = (from ors in db.ors
                                                          join allotments in db.allotments on ors.allotment equals allotments.ID
                                                          where ors.ID == id
                                                          select new
                                    {
                                        _allotment = allotments.ID,
                                        fundsource_id = (from _fsh in db.fsh where _fsh.allotment == allotments.ID.ToString() && _fsh.Code == ors.FundSource select _fsh.ID).FirstOrDefault()
                                    }).FirstOrDefault();

                                    var ors_fundsource_uacs = (from _fsa in db.fsa where _fsa.fundsource == ors_allotments.fundsource_id.ToString() && _fsa.expense_title == oec.uacs select _fsa.ID).ToList();

                                    if (ors_fundsource_uacs.Count <= 0)
                                    {
                                        FundSourceAmount new_fsa = new FundSourceAmount();
                                        new_fsa.expense_title = oec.uacs;
                                        new_fsa.amount        = 0;
                                        new_fsa.fundsource    = ors_allotments.fundsource_id.ToString();
                                        db.fsa.Add(new_fsa);
                                        db.SaveChanges();
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception innerex) { }
                }
            }
            return(GetORSUacs(id.ToString()));
        }