コード例 #1
0
ファイル: WheelMotor.cs プロジェクト: Schmitt-Florian/DangIt
 protected override void DI_Start(StartState state)
 {
     if (HighLogic.LoadedSceneIsFlight && this.part != null && this.part.Modules != null)
     {
         this.wheelMotor = this.part.Modules.OfType <ModuleWheels.ModuleWheelMotor>().First();
     }
 }
コード例 #2
0
ファイル: WheelMotor.cs プロジェクト: linuxgurugamer/DangIt
 protected override void DI_Start(StartState state)
 {
     if (HighLogic.LoadedSceneIsFlight && this.vessel != null && this.part != null && this.part.Modules != null)
     {
         var moduleWheels = this.part.Modules.OfType <ModuleWheels.ModuleWheelMotor>();
         if (moduleWheels != null && moduleWheels.Count() > 0)
         {
             this.wheelMotor = moduleWheels.First();
         }
     }
 }
コード例 #3
0
        public void CalculateAverageSpeed()
        {
            List <ModuleWheels.ModuleWheelMotor> operableWheels = new List <ModuleWheels.ModuleWheelMotor>();

            foreach (var part in this.vessel.parts)
            {
                ModuleWheels.ModuleWheelMotor wheelMotor = part.FindModuleImplementing <ModuleWheels.ModuleWheelMotor>();
                if (wheelMotor != null)
                {
                    operableWheels.Add(wheelMotor);
                }
            }

            // Average speed will vary depending on number of wheels online from 50 to 70 percent of wheel max speed
            this.averageSpeed = GetAverageSpeed(operableWheels);
        }
コード例 #4
0
ファイル: Wheel.cs プロジェクト: johnlinvc/krpc
        internal Wheel(Part part)
        {
            if (!Is(part))
            {
                throw new ArgumentException("Part is not a wheel");
            }
            Part = part;
            var internalPart = part.InternalPart;

            wheel      = internalPart.Module <ModuleWheelBase>();
            brakes     = internalPart.Module <ModuleWheels.ModuleWheelBrakes>();
            damage     = internalPart.Module <ModuleWheels.ModuleWheelDamage>();
            deployment = internalPart.Module <ModuleWheels.ModuleWheelDeployment>();
            motor      = internalPart.Module <ModuleWheels.ModuleWheelMotor> ();
            steering   = internalPart.Module <ModuleWheels.ModuleWheelSteering>();
            suspension = internalPart.Module <ModuleWheels.ModuleWheelSuspension>();
        }
コード例 #5
0
        public void CalculatePowerRequirement()
        {
            double powerRequired = 0;
            List <ModuleWheels.ModuleWheelMotor> operableWheels = new List <ModuleWheels.ModuleWheelMotor>();

            foreach (var part in this.vessel.parts)
            {
                ModuleWheels.ModuleWheelMotor wheelMotor = part.FindModuleImplementing <ModuleWheels.ModuleWheelMotor>();
                if (wheelMotor != null)
                {
                    if (wheelMotor.motorEnabled)
                    {
                        //						powerRequired += wheelMotor.inputResource.rate;
                        powerRequired += wheelMotor.avgResRate;
                    }
                }
            }

            // Average speed will vary depending on number of wheels online from 50 to 70 percent of wheel max speed
            powerRequired = powerRequired / 100 * 35;
            ScreenMessages.PostScreenMessage("Current power requirements " + powerRequired.ToString("F2") + "/s");
        }
コード例 #6
0
        /// <summary>
        /// Checks standard wheels with module ModuleWheelBase
        /// </summary>
        private WheelTestResult CheckWheels()
        {
            double powerRequired = 0;
            double maxSpeedSum   = 0;
            int    inTheAir      = 0;
            int    operable      = 0;
            int    damaged       = 0;
            int    online        = 0;

            List <Part> wheels = new List <Part>();

            for (int i = 0; i < this.vessel.parts.Count; i++)
            {
                var part = this.vessel.parts [i];
                if (part.Modules.Contains("ModuleWheelBase"))
                {
                    wheels.Add(part);
                }
            }

            for (int i = 0; i < wheels.Count; i++)
            {
                ModuleWheelBase wheelBase = wheels[i].FindModuleImplementing <ModuleWheelBase> ();
                if (wheelBase.wheelType == WheelType.LEG)
                {
                    continue;
                }

                ModuleWheels.ModuleWheelDamage wheelDamage = wheels[i].FindModuleImplementing <ModuleWheels.ModuleWheelDamage> ();
                // Malemute and Karibou wheels do not implement moduleDamage, so they're unbreakable?
                if (wheelDamage != null)
                {
                    // Wheel is damaged
                    if (wheelDamage.isDamaged)
                    {
                        damaged++;
                        continue;
                    }
                }

                // Whether or not wheel is touching the ground
                if (!wheelBase.isGrounded)
                {
                    inTheAir++;
                    continue;
                }
                else
                {
                    operable++;
                }

                ModuleWheels.ModuleWheelMotor wheelMotor = wheels[i].FindModuleImplementing <ModuleWheels.ModuleWheelMotor> ();
                if (wheelMotor != null)
                {
                    // Wheel is on
                    if (wheelMotor.motorEnabled)
                    {
                        powerRequired += wheelMotor.avgResRate;
                        online++;
                        double maxWheelSpeed = 0;
                        if (wheelMotor.part.name == "roverWheel1")                         //RoveMax Model M1 gives crazy values
                        {
                            maxWheelSpeed = 42;
                        }
                        else
                        {
                            maxWheelSpeed = wheelMotor.wheelSpeedMax;
                        }
                        maxSpeedSum += maxWheelSpeed;
                    }
                }
            }
            return(new WheelTestResult(powerRequired, maxSpeedSum, inTheAir, operable, damaged, online));
        }
コード例 #7
0
        /// <summary>
        /// Test stock wheels implementing standard module ModuleWheelBase
        /// </summary>
        /// <returns></returns>
        private WheelTestResult CheckStockWheels()
        {
            double powerRequired  = 0;
            double maxSpeedSum    = 0;
            int    inTheAir       = 0;
            int    operable       = 0;
            int    damaged        = 0;
            int    online         = 0;
            float  maxWheelRadius = 0;

            // Get wheel modules
            List <Part> wheels = new List <Part>();

            for (int i = 0; i < vessel.parts.Count; i++)
            {
                var part = vessel.parts[i];
                if (part.Modules.Contains("ModuleWheelBase"))
                {
                    wheels.Add(part);
                }
            }

            for (int i = 0; i < wheels.Count; i++)
            {
                ModuleWheelBase wheelBase = wheels[i].FindModuleImplementing <ModuleWheelBase>();

                // Skip legs
                if (wheelBase.wheelType == WheelType.LEG)
                {
                    continue;
                }

                // Save max wheel radius for height compensations
                if (wheelBase.radius < maxWheelRadius)
                {
                    maxWheelRadius = wheelBase.radius;
                }

                // Check damaged wheels
                ModuleWheels.ModuleWheelDamage wheelDamage = wheels[i].FindModuleImplementing <ModuleWheels.ModuleWheelDamage>();
                if (wheelDamage != null)
                {
                    if (wheelDamage.isDamaged)
                    {
                        damaged++;
                        continue;
                    }
                }

                // Whether or not wheel is touching the ground
                if (!wheelBase.isGrounded)
                {
                    inTheAir++;
                    continue;
                }
                else
                {
                    operable++;
                }

                // Check motorized wheels
                ModuleWheels.ModuleWheelMotor wheelMotor = wheels[i].FindModuleImplementing <ModuleWheels.ModuleWheelMotor>();
                if (wheelMotor != null)
                {
                    // Wheel is on
                    if (wheelMotor.motorEnabled)
                    {
                        powerRequired += wheelMotor.avgResRate;
                        online++;
                        double maxWheelSpeed = 0;

                        // RoveMax M1 and RoveMax M1-F (Making History expansion) don't have max wheels speed defined, so we just set it to something sensible
                        if ((wheelMotor.part.name == "roverWheel1") || (wheelMotor.part.name == "roverWheelM1-F "))
                        {
                            maxWheelSpeed = 42;
                        }
                        else
                        {
                            maxWheelSpeed = wheelMotor.wheelSpeedMax;
                        }
                        maxSpeedSum += maxWheelSpeed;
                    }
                }
            }

            return(new WheelTestResult(powerRequired, maxSpeedSum, inTheAir, operable, damaged, online, maxWheelRadius));
        }
コード例 #8
0
        public void Activate()
        {
            if (distanceToTarget == 0)
            {
                ScreenMessages.PostScreenMessage("No path to target calculated");
                return;
            }
            if (this.vessel.situation != Vessel.Situations.LANDED)
            {
                ScreenMessages.PostScreenMessage("Something is wrong", 5);
                ScreenMessages.PostScreenMessage("Hmmmm, what can it be?", 6);
                ScreenMessages.PostScreenMessage("Ah, yes! You're not landed!", 7);
                return;
            }

            this.averageSpeed = 0;
            double powerRequired = 0;
            int    inTheAir      = 0;

            List <ModuleWheels.ModuleWheelMotor> operableWheels = new List <ModuleWheels.ModuleWheelMotor>();

            foreach (var part in this.vessel.parts)
            {
                ModuleWheels.ModuleWheelMotor wheelMotor = part.FindModuleImplementing <ModuleWheels.ModuleWheelMotor>();
                if (wheelMotor != null)
                {
                    ModuleWheels.ModuleWheelDamage wheelDamage = part.FindModuleImplementing <ModuleWheels.ModuleWheelDamage>();
                    if (wheelDamage != null)
                    {                     // Malemute and Karibou wheels do not implement moduleDamage, thus making this mod cheaty
                        if (wheelDamage.isDamaged)
                        {
                            ScreenMessages.PostScreenMessage("Some wheels are broken, we're stuck!");
                            return;
                        }
                        if (wheelDamage.currentDownForce == 0)
                        {
                            inTheAir++;
                            continue;
                        }
                    }
                    if (wheelMotor.motorEnabled)
                    {
                        //						powerRequired += wheelMotor.inputResource.rate;
                        powerRequired += wheelMotor.avgResRate;
                    }
                    operableWheels.Add(wheelMotor);
                }
            }

            // Average speed will vary depending on number of wheels online from 50 to 70 percent of wheel max speed
            this.averageSpeed = GetAverageSpeed(operableWheels);

            if (this.averageSpeed == 0)
            {
                ScreenMessages.PostScreenMessage("At least two wheels must be online!");
                return;
            }

            if (inTheAir > 0 && operableWheels.Count < 4)
            {
                ScreenMessages.PostScreenMessage("Wheels are not touching the ground, are you serious???");
                return;
            }

            if (operableWheels.Count < 4)
            {
                ScreenMessages.PostScreenMessage("Monocycles, bicycles and trycicles are not supported, bye!");
                return;
            }

            // Generally moving at high speed requires less power than wheels' max consumption
            // BV will require max online wheels consumption to be less than 35% of max power production
            powerRequired = powerRequired / 100 * 35;

            double solarPower = CalculateSolarPower();
            double otherPower = CalculateOtherPower();

            if (solarPower + otherPower < powerRequired)
            {
                ScreenMessages.PostScreenMessage("Your power production is low, do something with it!");
                return;
            }

            if (otherPower >= powerRequired)
            {
                solarPowered = false;
            }

            isActive = true;
            lastTime = Planetarium.GetUniversalTime();

/*			distanceToTarget = GeoUtils.GetDistance(
 *                              this.vessel.latitude, this.vessel.longitude, targetLatitude, targetLongitude, this.vessel.mainBody.Radius
 *                      );*/
            distanceTravelled           = 0;
            Events["Activate"].active   = false;
            Events["Deactivate"].active = true;
            BonVoyage.Instance.UpdateRoverState(this.vessel, true);
            ScreenMessages.PostScreenMessage("Bon Voyage!!!");
        }