Exemple #1
0
        public FlightRecording(Vessel vessel = null)
        {
            usedPartIds = new List <string>();
            if (!vessel)
            {
                return;          // Used when creating a recording from a config-node.
            }
            status      = FlightRecordingStatus.PRELAUNCH;
            startTime   = Planetarium.GetUniversalTime();
            profileName = vessel.vesselName.ToString();

            // Save the minimum altitude we need for a stable orbit as well as the launch-body's name:
            launchBodyName = vessel.mainBody.bodyName;
            FloatCurve pressureCurve = vessel.mainBody.atmospherePressureCurve;

            for (int i = pressureCurve.Curve.length - 1; i >= 0; i--)
            {
                if (pressureCurve.Curve[i].value == 0)
                {
                    minAltitude = pressureCurve.Curve[i].time;
                    break;
                }
            }

            Update(vessel);
        }
Exemple #2
0
        public FlightRecording(Vessel vessel = null)
        {
            usedPartIds = new List <string>();
            if (!vessel)
            {
                return;          // Used when creating a recording from a config-node.
            }
            status      = FlightRecordingStatus.PRELAUNCH;
            startTime   = Planetarium.GetUniversalTime();
            profileName = vessel.vesselName.ToString();

            // Save the minimum altitude we need for a stable orbit as well as the launch-body's name:
            launchBodyName = vessel.mainBody.bodyName;
            var pressureCurve = vessel.mainBody.atmospherePressureCurve;

            if (pressureCurve.Curve.length == 0)
            {
                minAltitude = 1; // if there's no atmosphere, theoretically we could orbit at 1m
            }
            for (var i = pressureCurve.Curve.length - 1; i >= 0; i--)
            {
                if (pressureCurve.Curve[i].value == 0)
                {
                    minAltitude = Math.Max(pressureCurve.Curve[i].time, 1); // Min orbit on a body with no atmosphere assumed to be 1
                    break;
                }
            }

            Update(vessel);
        }
Exemple #3
0
        public void DeployPayloadAssembly(List <PayloadAssembly> payloadAssemblies)
        {
            if (payloadAssemblies.Count < 1)
            {
                return;
            }

            // Sort the assemblies from largest to smallest, to avoid problems with detaching assemblies that contain other assemblies on the list:
            payloadAssemblies.Sort((x, y) => y.partCount.CompareTo(x.partCount));

            // Deploy all selected payloads:
            double deployedMass  = 0;
            double deployedFunds = 0;

            foreach (PayloadAssembly payloadAssembly in payloadAssemblies)
            {
                if (!payloadAssembly.detachmentPart || !this.vessel)
                {
                    continue;
                }
                if (!this.vessel.parts.Contains(payloadAssembly.detachmentPart))
                {
                    continue;                     // The subassembly was probably already detached together with a bigger one.
                }
                payloadAssembly.Highlight(false); // Turn off highlighting, in case it was on.

                foreach (ModuleDockingNode dockingModule in payloadAssembly.detachmentPart.FindModulesImplementing <ModuleDockingNode>())
                {
                    dockingModule.Decouple();
                }
                foreach (ModuleDecouple decoupleModule in payloadAssembly.detachmentPart.FindModulesImplementing <ModuleDecouple>())
                {
                    decoupleModule.Decouple();
                }
                foreach (ModuleAnchoredDecoupler decoupleModule in payloadAssembly.detachmentPart.FindModulesImplementing <ModuleAnchoredDecoupler>())
                {
                    decoupleModule.Decouple();
                }

                deployedMass  += payloadAssembly.mass;
                deployedFunds += payloadAssembly.value;
            }

            // If there was something deployed, we can move on to the next stage:
            if (deployedMass > 0)
            {
                this.payloadMass      = deployedMass;
                this.missionType      = MissionProfileType.DEPLOY;
                this.deploymentTime   = Planetarium.GetUniversalTime();
                this.status           = FlightRecordingStatus.DESCENDING;
                this.dockingPortTypes = this.currentStats.dockingPortTypes; // This mission-type doesn't need docking ports, but this way it's not inconsistent.

                // The weight and value of the payload should not counted in the vessel's stats:
                this.launchMass -= deployedMass;
                this.launchCost -= Math.Round(deployedFunds);
            }
        }
Exemple #4
0
        public void DeployPayloadResources(Dictionary <string, double> requestedResources)
        {
            double dumpedMass  = 0;
            double dumpedFunds = 0;

            if (!this.CanPerformMission(MissionProfileType.TRANSPORT))
            {
                return;
            }

            // Try to dump the requested amount of resources from the vessel:
            foreach (var item in requestedResources)
            {
                string requestedName   = item.Key;
                double requestedAmount = item.Value;

                PayloadResource payloadResource = null;
                if (!this.currentStats.payloadResources.TryGetValue(requestedName, out payloadResource))
                {
                    continue;
                }
                if (requestedAmount > payloadResource.amount)
                {
                    requestedAmount = payloadResource.amount;
                }
                if (requestedAmount < 0)
                {
                    requestedAmount = 0;
                }

                // Find parts to dump the resources from:
                double amountToDump = requestedAmount;
                foreach (Part part in vessel.parts)
                {
                    if (amountToDump <= 0)
                    {
                        break;
                    }
                    double dumpedAmount = part.RequestResource(requestedName, amountToDump);
                    if (dumpedAmount == 0)
                    {
                        continue;
                    }
                    Debug.Log("[KSTS] dumped " + dumpedAmount.ToString() + " of " + requestedName.ToString() + " from " + part.name.ToString());
                    amountToDump -= dumpedAmount;
                    dumpedMass   += dumpedAmount * payloadResource.mass;
                    if (KSTS.resourceDictionary.ContainsKey(payloadResource.name))
                    {
                        dumpedFunds += dumpedAmount * KSTS.resourceDictionary[payloadResource.name].unitCost;
                    }
                }
            }

            // If there was something dumped, we can move on to the next stage:
            if (dumpedMass > 0)
            {
                this.payloadMass      = dumpedMass;
                this.missionType      = MissionProfileType.TRANSPORT;
                this.deploymentTime   = Planetarium.GetUniversalTime();
                this.status           = FlightRecordingStatus.DESCENDING;
                this.dockingPortTypes = this.currentStats.dockingPortTypes;

                // The weight and value of the payload should not counted in the vessel's stats:
                this.launchMass -= dumpedMass;
                this.launchCost -= Math.Round(dumpedFunds);
            }
        }