示例#1
0
    public void Approach(ZACommons commons, EventDriver eventDriver)
    {
        if (Mode != Modes.Approaching)
        {
            return;
        }

        var shipControl = (ShipControlCommons)commons;

        var controller = GetShipController(shipControl);

        if (controller == null)
        {
            return;
        }
        var gravity = controller.GetNaturalGravity();

        if (gravity.LengthSquared() > 0.0)
        {
            double yawPitchError;
            seeker.Seek(shipControl, gravity, out yawPitchError);

            // Shouldn't fail since we do gravity check above
            if (!controller.TryGetPlanetElevation(MyPlanetElevation.Surface, out Elevation))
            {
                Elevation = 0.0;
            }

            Distance = Elevation - TargetElevation;
            if (Elevation <= TargetElevation)
            {
                // All done. Re-enable thrusters and restore control.
                Reset(shipControl);

                TimerBlockUtils.StartTimerBlockWithName(commons.Blocks, VTVLHELPER_DROP_DONE);
            }
            else
            {
                var targetSpeed = Math.Min(Distance * VTVLHELPER_APPROACH_GAIN,
                                           VTVLHELPER_BRAKING_SPEED);
                targetSpeed = Math.Max(targetSpeed, MinimumSpeed);

                cruiser.Cruise(shipControl, targetSpeed,
                               condition: ThrusterCondition,
                               enableForward: false);

                // Keep on target
                Alignment(shipControl, controller);

                eventDriver.Schedule(FramesPerRun, Approach);
            }
        }
        else
        {
            // If we left gravity, just abort.
            Reset(shipControl);
        }
    }
示例#2
0
    private void TriggerSafeMode(ZACommons commons, EventDriver eventDriver,
                                 string timerBlockName = SAFE_MODE_NAME)
    {
        Abandoned = true; // No need to trigger any other condition until reset

        for (var i = 0; i < SafeModeHandlers.Length; i++)
        {
            SafeModeHandlers[i].SafeMode(commons, eventDriver);
        }

        TimerBlockUtils.StartTimerBlockWithName(commons.Blocks, timerBlockName);
    }
示例#3
0
    public void Launch(ZACommons commons, EventDriver eventDriver)
    {
        if (Mode != Modes.Launching)
        {
            return;
        }

        var shipControl = (ShipControlCommons)commons;

        var controller = GetShipController(shipControl);

        if (controller == null)
        {
            return;
        }
        var gravity = controller.GetNaturalGravity();

        if (gravity.LengthSquared() > 0.0)
        {
            double yawPitchError;
            seeker.Seek(shipControl, -gravity, out yawPitchError);

            cruiser.Cruise(shipControl, VTVLHELPER_LAUNCH_SPEED,
                           condition: ThrusterCondition,
                           enableBackward: false);

            eventDriver.Schedule(FramesPerRun, Launch);
        }
        else
        {
            // Out of gravity
            Reset(shipControl);

            TimerBlockUtils.StartTimerBlockWithName(commons.Blocks, VTVLHELPER_LAUNCH_DONE);
        }
    }
示例#4
0
    public void Run(ZACommons commons, EventDriver eventDriver)
    {
        var tanks = ZACommons.GetBlocksOfType <IMyGasTank>(commons.AllBlocks,
                                                           tank => tank.IsFunctional &&
                                                           tank.IsWorking &&
                                                           tank.CustomName.IndexOf("[Excluded]", ZACommons.IGNORE_CASE) < 0);

        var currentState = GetOxygenState(tanks);

        // Only act on level transitions
        if (PreviousState != currentState)
        {
            PreviousState = currentState;

            // We need a tri-state variable, so... nullable
            bool?generateOxygen = null;
            bool?farmOxygen     = null;

            switch (currentState)
            {
            case OxygenLevel.High:
                // Turn off all oxygen production
                generateOxygen = false;
                farmOxygen     = false;
                break;

            case OxygenLevel.Normal:
                // Do nothing (but keep farms up)
                farmOxygen = true;
                break;

            case OxygenLevel.Buffer:
                // Start producing oxygen
                generateOxygen = true;
                farmOxygen     = true;
                break;

            case OxygenLevel.Low:
                // Definitely start producing oxygen
                generateOxygen = true;
                farmOxygen     = true;
                // For now, it's intentional that we start timer blocks
                // on all grids... we'll see how it goes
                TimerBlockUtils.StartTimerBlockWithName(commons.AllBlocks, LOW_OXYGEN_NAME);
                break;
            }

            if (generateOxygen != null)
            {
                // Limit to this grid -- don't mess with any other ship's systems
                var generators =
                    ZACommons.GetBlocksOfType <IMyGasGenerator>(commons.Blocks,
                                                                block => block.IsFunctional);
                ZACommons.EnableBlocks(generators, (bool)generateOxygen);
            }
            if (farmOxygen != null)
            {
                var farms =
                    ZACommons.GetBlocksOfType <IMyOxygenFarm>(commons.Blocks,
                                                              block => block.IsFunctional);

                // Farms don't implement IMyFunctionalBlock??
                ZACommons.EnableBlocks(farms, (bool)farmOxygen);

                // We'll count atmosphere intake vents too, since they're "free"
                var vents =
                    ZACommons.GetBlocksOfType <IMyAirVent>(commons.Blocks,
                                                           vent => vent.IsFunctional &&
                                                           vent.Depressurize &&
                                                           vent.CustomName.IndexOf("[Intake]", ZACommons.IGNORE_CASE) >= 0);

                ZACommons.EnableBlocks(vents, (bool)farmOxygen);
            }
        }

        eventDriver.Schedule(RunDelay, Run);
    }