Example #1
0
    public void Init(ZACommons commons, EventDriver eventDriver)
    {
        var shipControl = (ShipControlCommons)commons;

        seeker.Init(shipControl,
                    shipUp: shipControl.ShipUp,
                    shipForward: shipControl.ShipForward);
        cruiser.Init(shipControl);
        velocimeter.Reset();
        VTicks = 0;

        FullBurnTriggerLast = eventDriver.TimeSinceStart;

        eventDriver.Schedule(0, Run);
    }
Example #2
0
    private void Start(ShipControlCommons shipControl, EventDriver eventDriver)
    {
        shipControl.Reset(gyroOverride: true);

        if (MINING_ROLL_RPM > 0.0f)
        {
            shipControl.GyroControl.SetAxisVelocityRPM(GyroControl.Roll, MINING_ROLL_RPM);
        }

        seeker.Init(shipControl,
                    shipUp: shipControl.ShipUp,
                    shipForward: shipControl.ShipForward);
        cruiser.Init(shipControl,
                     localForward: Base6Directions.Direction.Forward);

        if (Mode != MINING)
        {
            Mode = MINING;
            eventDriver.Schedule(0, Mine);
        }
    }
Example #3
0
    public void Start(ZACommons commons, EventDriver eventDriver)
    {
        var shipControl = (ShipControlCommons)commons;

        shipControl.Reset(gyroOverride: true, thrusterEnable: null);
        forwardCruiser.Init(shipControl,
                            localForward: shipControl.ShipForward);
        upCruiser.Init(shipControl,
                       localForward: shipControl.ShipUp);
        leftCruiser.Init(shipControl,
                         localForward: Base6Directions.GetLeft(shipControl.ShipUp, shipControl.ShipForward));
        eventDriver.Schedule(0, Run);
    }
Example #4
0
    public void Burn(ZACommons commons, EventDriver eventDriver)
    {
        if (ShouldAbort(commons, eventDriver, Modes.Burning, false))
        {
            return;
        }

        var shipControl = (ShipControlCommons)commons;

        var controller = GetShipController(shipControl);

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

        if (gravity.LengthSquared() > 0.0)
        {
            // Override gyro, disable "bottom" thrusters
            shipControl.Reset(gyroOverride: true, thrusterEnable: true,
                              thrusterCondition: ThrusterCondition);
            shipControl.ThrustControl.Enable(Base6Directions.GetFlippedDirection(BrakeDirection), false);

            var down = shipControl.ShipBlockOrientation.TransformDirection(BrakeDirection);
            seeker.Init(shipControl,
                        shipUp: Base6Directions.GetPerpendicular(down),
                        shipForward: down);

            if (Autodrop)
            {
                // "forward" & "right"
                var forward = Base6Directions.GetPerpendicular(BrakeDirection);
                var right   = Base6Directions.GetCross(forward, BrakeDirection);
                // Actual orientations don't matter
                // Just as long as they're planar & perpendicular to down
                LongCruiser.Init(shipControl, localForward: forward);
                LatCruiser.Init(shipControl, localForward: right);
            }

            Mode = Modes.Gliding;
            eventDriver.Schedule(FramesPerRun, Glide);
        }
        else
        {
            cruiser.Cruise(shipControl, VTVLHELPER_BURN_SPEED,
                           condition: ThrusterCondition);

            eventDriver.Schedule(FramesPerRun, Burn);
        }
    }
Example #5
0
    public void Start(ZACommons commons, EventDriver eventDriver)
    {
        var shipControl = (ShipControlCommons)commons;

        shipControl.Reset(gyroOverride: true, thrusterEnable: null);

        var forward = shipControl.ShipBlockOrientation.TransformDirection(LocalForward);

        seeker.Init(shipControl,
                    shipUp: Base6Directions.GetPerpendicular(forward),
                    shipForward: forward);

        cruiser.Init(shipControl,
                     localForward: LocalForward);

        eventDriver.Schedule(0, Run);
    }
Example #6
0
    public void HandleCommand(ZACommons commons, EventDriver eventDriver,
                              string argument)
    {
        argument = argument.Trim().ToLower();
        var parts = argument.Split(new char[] { ' ' }, 10);

        if (parts.Length < 2)
        {
            return;
        }
        var command    = parts[0];
        var subcommand = parts[1];

        if (command == "drop")
        {
            var shipControl = (ShipControlCommons)commons;

            if (subcommand == "start")
            {
                ThrusterCondition = parts.Length > 2 ? ParseThrusterFlags(parts[2]) : null;
                shipControl.Reset(gyroOverride: false, thrusterEnable: true,
                                  thrusterCondition: ThrusterCondition);
                cruiser.Init(shipControl,
                             localForward: BurnDirection);

                if (Mode != Modes.Burning)
                {
                    Mode     = Modes.Burning;
                    Autodrop = false;
                    eventDriver.Schedule(0, Burn);
                }

                SaveLastCommand(commons, argument);
            }
            else if (subcommand == "brake" || subcommand == "descend")
            {
                ThrusterCondition = parts.Length > 2 ? ParseThrusterFlags(parts[2]) : null;
                shipControl.Reset(gyroOverride: true, thrusterEnable: true,
                                  thrusterCondition: ThrusterCondition);
                var down = shipControl.ShipBlockOrientation.TransformDirection(BrakeDirection);
                seeker.Init(shipControl,
                            shipUp: Base6Directions.GetPerpendicular(down),
                            shipForward: down);
                cruiser.Init(shipControl,
                             localForward: BrakeDirection);

                if (Mode != Modes.Braking)
                {
                    Mode = Modes.Braking;
                    eventDriver.Schedule(FramesPerRun, Brake);
                }

                SaveLastCommand(commons, argument);
            }
            else if (subcommand == "abort" || subcommand == "stop" ||
                     subcommand == "reset")
            {
                Reset(shipControl);
            }
            else if (subcommand == "auto")
            {
                // Defaults
                ThrusterCondition     = null;
                AutoThrusterCondition = null;
                TargetElevation       = 1000.0;
                // From arguments
                if (parts.Length > 2)
                {
                    if (double.TryParse(parts[2], out TargetElevation))
                    {
                        TargetElevation = Math.Max(0.0, TargetElevation);
                    }
                    else
                    {
                        TargetElevation = 1000.0;
                    }
                }

                if (parts.Length > 3)
                {
                    ThrusterCondition = ParseThrusterFlags(parts[3]);
                }

                BrakingElevation = TargetElevation;
                if (parts.Length > 4)
                {
                    if (double.TryParse(parts[4], out BrakingElevation))
                    {
                        BrakingElevation = Math.Max(TargetElevation, BrakingElevation);
                    }
                    else
                    {
                        BrakingElevation = TargetElevation;
                    }
                }

                if (parts.Length > 5)
                {
                    AutoThrusterCondition = ParseThrusterFlags(parts[5]);
                }

                MinimumSpeed = VTVLHELPER_MINIMUM_SPEED;
                if (parts.Length > 6)
                {
                    if (double.TryParse(parts[6], out MinimumSpeed))
                    {
                        MinimumSpeed = Math.Max(1.0, MinimumSpeed);
                    }
                    else
                    {
                        MinimumSpeed = VTVLHELPER_MINIMUM_SPEED;
                    }
                }

                DropTarget = null;
                if (parts.Length > 9)
                {
                    double x, y, z;
                    if (double.TryParse(parts[7], out x) &&
                        double.TryParse(parts[8], out y) &&
                        double.TryParse(parts[9], out z))
                    {
                        DropTarget = new Vector3D(x, y, z);
                    }
                }

                shipControl.Reset(gyroOverride: false, thrusterEnable: true,
                                  thrusterCondition: ThrusterCondition);
                cruiser.Init(shipControl,
                             localForward: BurnDirection);

                if (Mode != Modes.Burning)
                {
                    Mode     = Modes.Burning;
                    Autodrop = true;
                    eventDriver.Schedule(0, Burn);
                }

                SaveLastCommand(commons, argument);
            }
        }
        else if (command == "launch")
        {
            var shipControl = (ShipControlCommons)commons;

            if (subcommand == "start")
            {
                ThrusterCondition = parts.Length > 2 ? ParseThrusterFlags(parts[2]) : null;
                shipControl.Reset(gyroOverride: true, thrusterEnable: true,
                                  thrusterCondition: ThrusterCondition);
                var forward = shipControl.ShipBlockOrientation.TransformDirection(LaunchDirection);
                seeker.Init(shipControl,
                            shipUp: Base6Directions.GetPerpendicular(forward),
                            shipForward: forward);
                cruiser.Init(shipControl,
                             localForward: LaunchDirection);

                if (Mode != Modes.Launching)
                {
                    Mode = Modes.Launching;
                    eventDriver.Schedule(FramesPerRun, Launch);
                }

                SaveLastCommand(commons, argument);
            }
            else if (subcommand == "abort" || subcommand == "stop" ||
                     subcommand == "reset")
            {
                Reset(shipControl);
            }
        }
        else if (command == "orbit")
        {
            var shipControl = (ShipControlCommons)commons;

            if (subcommand == "start")
            {
                OrbitInit(shipControl);

                if (Mode != Modes.Orbiting)
                {
                    OrbitTicks = 0;
                    Mode       = Modes.Orbiting;
                    eventDriver.Schedule(0, OrbitOn);
                }

                SaveLastCommand(commons, argument);
            }
            else if (subcommand == "abort" || subcommand == "stop" ||
                     subcommand == "reset")
            {
                ResetOrbit(shipControl);
            }
        }
    }