示例#1
0
    IEnumerator WinReset()
    {
        CameraOverhead();
        if (SoundtrackManager.s_instance != null)
        {
            SoundtrackManager.s_instance.PlayAudioSource(SoundtrackManager.s_instance.bell);
        }
        yield return(new WaitForSeconds(3f));

        if (setup2.activeSelf == false)
        {
            setup2.SetActive(true);
            setup1.SetActive(false);
            playerBoat.transform.position = setup2transform.position;
            playerBoat.transform.rotation = setup2transform.rotation;

            curState = DockingState.instructions2;
            playerBoat.GetComponent <Rigidbody>().isKinematic = true;
            gameplayUi.SetActive(false);
            parallelMethodUI.SetActive(true);
            instructionsUI.GetComponent <InstructionsPanel>().GoToPanel(instructionsUI.transform.GetChild(0).GetChild(0).gameObject);
        }
        else
        {
            curState = DockingState.win;
            if (SoundtrackManager.s_instance != null)
            {
                SoundtrackManager.s_instance.PlayAudioSource(SoundtrackManager.s_instance.bell);
            }
            CongratulationsPopUp.s_instance.InitializeCongratulationsPanel("Docking");
        }
    }
        /// <summary>
        /// Unsubscribes from manipulation events.
        /// </summary>
        private void OnDisable()
        {
            if (objectManipulator != null)
            {
                objectManipulator.OnManipulationStarted.RemoveListener(OnManipulationStarted);
                objectManipulator.OnManipulationEnded.RemoveListener(OnManipulationEnded);

                objectManipulator = null;
            }

            if (manipulationHandler != null)
            {
                manipulationHandler.OnManipulationStarted.RemoveListener(OnManipulationStarted);
                manipulationHandler.OnManipulationEnded.RemoveListener(OnManipulationEnded);

                manipulationHandler = null;
            }

            if (dockedPosition != null)
            {
                dockedPosition.DockedObject = null;
                dockedPosition = null;
            }

            overlappingPositions.Clear();
            dockingState = DockingState.Undocked;
        }
示例#3
0
文件: Docking.cs 项目: spooky/KKnD
        public void StartUndocking()
        {
            DockingState = DockingState.Undocking;
            var dockingSequence = Game.ModData.ObjectCreator.CreateObject <DockingSequence>(Dockable.Info.DockingSequenceActivity + "DockingSequence");

            dockingSequence.Undock(DockableActor, Dockable, DockActor, Dock);
            QueueChild(dockingSequence);
        }
示例#4
0
        public void StartUndocking()
        {
            this.DockingState = DockingState.Undocking;

            this.QueueChild(
                new Drag(this.dockableActor, this.DockActor.CenterPosition + this.Dock.Info.Position, this.initialPosition, this.Dock.Info.DragLength)
                );
        }
示例#5
0
        public Docking(Actor dockableActor, Actor dockActor, Dock dock)
        {
            this.dockableActor = dockableActor;
            this.DockActor     = dockActor;
            this.Dock          = dock;

            this.DockingState = DockingState.Approaching;
        }
示例#6
0
文件: Docking.cs 项目: spooky/KKnD
        public Docking(Actor dockableActor, Dockable dockable, Actor dockActor, Dock dock)
        {
            DockableActor = dockableActor;
            Dockable      = dockable;
            DockActor     = dockActor;
            Dock          = dock;

            DockingState = DockingState.Approaching;
        }
示例#7
0
        public override Activity Tick(Actor self)
        {
            switch (dockingState)
            {
            case DockingState.Wait:
                return(this);

            case DockingState.Turn:
                dockingState = DockingState.Dock;
                if (IsDragRequired)
                {
                    return(ActivityUtils.SequenceActivities(new Turn(self, DockAngle), new Drag(self, StartDrag, EndDrag, DragLength), this));
                }
                return(ActivityUtils.SequenceActivities(new Turn(self, DockAngle), this));

            case DockingState.Dock:
                if (Refinery.IsInWorld && !Refinery.IsDead)
                {
                    foreach (var nd in Refinery.TraitsImplementing <INotifyDocking>())
                    {
                        nd.Docked(Refinery, self);
                    }
                }
                return(OnStateDock(self));

            case DockingState.Loop:
                if (!Refinery.IsInWorld || Refinery.IsDead || Harv.TickUnload(self, Refinery))
                {
                    dockingState = DockingState.Undock;
                }
                return(this);

            case DockingState.Undock:
                return(OnStateUndock(self));

            case DockingState.Complete:
                if (Refinery.IsInWorld && !Refinery.IsDead)
                {
                    foreach (var nd in Refinery.TraitsImplementing <INotifyDocking>())
                    {
                        nd.Undocked(Refinery, self);
                    }
                }
                Harv.LastLinkedProc = Harv.LinkedProc;
                Harv.LinkProc(self, null);
                if (IsDragRequired)
                {
                    return(ActivityUtils.SequenceActivities(new Drag(self, EndDrag, StartDrag, DragLength), NextActivity));
                }
                return(NextActivity);
            }

            throw new InvalidOperationException("Invalid harvester dock state.");
        }
示例#8
0
        /// <summary>
        /// Updates the transform and state of this object every frame, depending on
        /// manipulations and docking state.
        /// </summary>
        public void Update()
        {
            if (isDragging && overlappingPositions.Count > 0)
            {
                var closestPosition = GetClosestPosition();
                if (closestPosition.IsOccupied)
                {
                    closestPosition.GetComponentInParent <Dock>().TryMoveToFreeSpace(closestPosition);
                }
            }

            if (dockingState == DockingState.Docked || dockingState == DockingState.Docking)
            {
                Assert.IsNotNull(dockedPosition, "When a dockable is docked, its dockedPosition must be valid.");
                Assert.AreEqual(dockedPosition.DockedObject, this, "When a dockable is docked, its dockedPosition reference the dockable.");

                var lerpTime = dockingState == DockingState.Docked ? moveLerpTimeWhenDocked : moveLerpTime;

                if (!isDragging)
                {
                    // Don't override dragging
                    transform.position = Solver.SmoothTo(transform.position, dockedPosition.transform.position, Time.deltaTime, lerpTime);
                    transform.rotation = Solver.SmoothTo(transform.rotation, dockedPosition.transform.rotation, Time.deltaTime, lerpTime);
                }

                transform.localScale = Solver.SmoothTo(transform.localScale, dockedPositionScale, Time.deltaTime, lerpTime);

                if (VectorExtensions.CloseEnough(dockedPosition.transform.position, transform.position, distanceTolerance) &&
                    QuaternionExtensions.AlignedEnough(dockedPosition.transform.rotation, transform.rotation, angleTolerance) &&
                    AboutTheSameSize(dockedPositionScale.x, transform.localScale.x))
                {
                    // Finished docking
                    dockingState = DockingState.Docked;

                    // Snap to position
                    transform.position   = dockedPosition.transform.position;
                    transform.rotation   = dockedPosition.transform.rotation;
                    transform.localScale = dockedPositionScale;
                }
            }
            else if (dockedPosition == null && dockingState == DockingState.Undocking)
            {
                transform.localScale = Solver.SmoothTo(transform.localScale, originalScale, Time.deltaTime, moveLerpTime);

                if (AboutTheSameSize(originalScale.x, transform.localScale.x))
                {
                    // Finished undocking
                    dockingState = DockingState.Undocked;

                    // Snap to size
                    transform.localScale = originalScale;
                }
            }
        }
        private DockData GetDockData(ContentDocument pane)
        {
            if (pane.PreferredDockData != null)
            {
                return(pane.PreferredDockData);
            }
            DockingState dockState = pane.Control.DockingContainer.DockState == DockingState.Unknown ||
                                     pane.Control.DockingContainer.DockState == DockingState.Hidden ?
                                     DockingState.Document : pane.Control.DockingContainer.DockState;

            return(new DockData(dockState, Rectangle.Empty));
        }
示例#10
0
 public HarvesterDockSequence(Actor self, Actor refinery, int dockAngle, bool isDragRequired, WVec dragOffset, int dragLength)
 {
     dockingState   = DockingState.Turn;
     Refinery       = refinery;
     DockAngle      = dockAngle;
     IsDragRequired = isDragRequired;
     DragOffset     = dragOffset;
     DragLength     = dragLength;
     Harv           = self.Trait <Harvester>();
     StartDrag      = self.CenterPosition;
     EndDrag        = refinery.CenterPosition + DragOffset;
 }
示例#11
0
        /// <summary>
        /// Undocks this <see cref="Dockable"/> from the current <see cref="DockPosition"/> where it is docked.
        /// </summary>
        public void Undock()
        {
            if (!CanUndock)
            {
                Debug.LogError($"Trying to undock an object that was not docked. State = {dockingState}");
                return;
            }

            Debug.Log($"Undocking object {gameObject.name} from position {dockedPosition.gameObject.name}");

            dockedPosition.DockedObject = null;
            dockedPosition      = null;
            dockedPositionScale = Vector3.one;
            dockingState        = DockingState.Undocking;
        }
示例#12
0
    void Update()
    {
        switch (curState)
        {
        case DockingState.instructions1:
        case DockingState.instructions2:
        {
            if (switchToGamePlay)
            {
                playerBoat.GetComponent <Rigidbody> ().isKinematic = false;
                switchToGamePlay = false;
                curState         = DockingState.gameplay;
            }
            break;
        }

        case DockingState.gameplay:
        {
            if (switchToReset)
            {
                switchToReset = false;
                curState      = DockingState.reset;
            }
            break;
        }

        case DockingState.reset:
        {
            //				StartCoroutine ("PauseBoats");
            if (switchToGamePlay)
            {
                NavBoatControl.s_instance.boomSlider.value = 80f;
                switchToGamePlay = false;
                DieOnHitBoat[] arrows = GameObject.FindObjectsOfType <DieOnHitBoat> ();
                foreach (DieOnHitBoat x in arrows)
                {
                    x.Reset();
                }
                curState = DockingState.gameplay;
                StartCoroutine("HackyBSFix");
            }
            break;
        }
        }
    }
示例#13
0
        public void Show(IInteractiveWindow theWindow, DockingState state)
        {
            DockContent dockableWindow = theWindow as DockContent;

            if (dockableWindow != null)
            {
                DockState dockState = DockState.Document;
                if (state == DockingState.DockRight)
                {
                    dockState = DockState.DockRight;
                }
                else if (state == DockingState.Float)
                {
                    dockState = DockState.Float;
                }

                this.dockPanel.Invoke((MethodInvoker) delegate
                {
                    dockableWindow.Show(this.dockPanel, dockState);
                });
            }
        }
    public void ClosedInstructionsPanel()
    {
        switch( curState ) {
        case DockingState.briefing:
            briefingUI.SetActive( false );
            perpendicularMethodUI.SetActive( true );
            curState = DockingState.instructions1;
            break;

        case DockingState.instructions1:
            perpendicularMethodUI.SetActive( false );
            gameplayUi.SetActive( true );
            StartGame();
            break;

        case DockingState.instructions2:
            parallelMethodUI.SetActive (false);
            gameplayUi.SetActive (true);
            CameraMain ();
            switchToGamePlay = true;
            break;
        }
    }
示例#15
0
    public void ClosedInstructionsPanel()
    {
        switch (curState)
        {
        case DockingState.briefing:
            briefingUI.SetActive(false);
            perpendicularMethodUI.SetActive(true);
            curState = DockingState.instructions1;
            break;

        case DockingState.instructions1:
            perpendicularMethodUI.SetActive(false);
            gameplayUi.SetActive(true);
            StartGame();
            break;

        case DockingState.instructions2:
            parallelMethodUI.SetActive(false);
            gameplayUi.SetActive(true);
            CameraMain();
            switchToGamePlay = true;
            break;
        }
    }
示例#16
0
        /// <summary>
        /// Docks this object in a given <see cref="DockPosition"/>.
        /// </summary>
        /// <param name="position">The <see cref="DockPosition"/> where we'd like to dock this object.</param>
        public void Dock(DockPosition position)
        {
            if (!CanDock)
            {
                Debug.LogError($"Trying to dock an object that was not undocked. State = {dockingState}");
                return;
            }

            Debug.Log($"Docking object {gameObject.name} on position {position.gameObject.name}");

            dockedPosition = position;
            dockedPosition.DockedObject = this;
            float scaleToFit = gameObject.GetComponent <Collider>().bounds.GetScaleToFitInside(dockedPosition.GetComponent <Collider>().bounds);

            dockedPositionScale = transform.localScale * scaleToFit;

            if (dockingState == DockingState.Undocked)
            {
                // Only register the original scale when first docking
                originalScale = transform.localScale;
            }

            dockingState = DockingState.Docking;
        }
示例#17
0
        public override bool Tick(Actor self)
        {
            if ((this.DockActor.IsDead || !this.DockActor.IsInWorld || this.Dock.IsTraitDisabled) && !this.IsCanceling)
            {
                this.Cancel(self, true);
            }

            switch (this.DockingState)
            {
            case DockingState.Approaching:
                if (this.State == ActivityState.Canceling)
                {
                    return(true);
                }

                if (this.ChildActivity != null)
                {
                    break;
                }

                var distance = WDist.FromCells(this.Dock.Info.QueueDistance);

                if ((this.dockableActor.CenterPosition - this.DockActor.CenterPosition).Length > distance.Length)
                {
                    this.QueueChild(new Move(this.dockableActor, Target.FromActor(this.DockActor), distance));
                }
                else
                {
                    this.DockingState = DockingState.Waiting;
                    this.Dock.Add(this.dockableActor);
                }

                break;

            case DockingState.Waiting:
                if (this.State == ActivityState.Canceling)
                {
                    this.Dock.Remove(this.dockableActor);

                    return(true);
                }

                break;

            case DockingState.PrepareDocking:
                if (this.State == ActivityState.Canceling)
                {
                    this.Dock.Remove(this.dockableActor);

                    return(true);
                }

                if (this.ChildActivity != null)
                {
                    break;
                }

                var target = this.DockActor.World.Map.CellContaining(this.DockActor.CenterPosition + this.Dock.Info.Position + this.Dock.Info.DragOffset);

                if (this.dockableActor.Location != target)
                {
                    this.QueueChild(new Move(this.dockableActor, target));
                }
                else
                {
                    this.DockingState = DockingState.Docking;

                    this.QueueChild(new Turn(this.dockableActor, this.Dock.Info.Angle));
                    this.initialPosition = this.dockableActor.CenterPosition;

                    this.QueueChild(
                        new Drag(
                            this.dockableActor,
                            this.dockableActor.CenterPosition,
                            this.DockActor.CenterPosition + this.Dock.Info.Position,
                            this.Dock.Info.DragLength
                            )
                        );
                }

                break;

            case DockingState.Docking:
                if (this.State == ActivityState.Canceling)
                {
                    this.StartUndocking();

                    return(false);
                }

                if (this.ChildActivity == null)
                {
                    this.DockingState = DockingState.Docked;
                    this.Dock.OnDock(this.DockActor);
                }

                break;

            case DockingState.Docked:
                if (this.State == ActivityState.Canceling)
                {
                    this.StartUndocking();

                    return(false);
                }

                break;

            case DockingState.Undocking:
                if (this.ChildActivity == null)
                {
                    this.DockingState = DockingState.None;
                    this.Dock.OnUndock();
                    this.Dock.Remove(this.dockableActor);

                    if (!this.DockActor.IsDead && this.DockActor.IsInWorld)
                    {
                        var rallyPoint = this.DockActor.TraitOrDefault <RallyPoint>();

                        if (rallyPoint != null && rallyPoint.Path.Any())
                        {
                            foreach (var cell in rallyPoint.Path)
                            {
                                this.dockableActor.QueueActivity(new Move(this.dockableActor, cell));
                            }
                        }
                    }
                }

                break;

            case DockingState.None:
                return(true);

            default:
                throw new ArgumentOutOfRangeException(Enum.GetName(this.DockingState));
            }

            return(false);
        }
示例#18
0
 void OnMoored(SpaceStation station)
 {
     localStation = station;
     state = DockingState.Docked;
 }
示例#19
0
        public override bool Tick(Actor self)
        {
            if ((DockActor.IsDead || !DockActor.IsInWorld || Dock.IsTraitDisabled) && !IsCanceling)
            {
                Cancel(self, true);
            }

            switch (DockingState)
            {
            case DockingState.Approaching:
                if (State == ActivityState.Canceling)
                {
                    return(true);
                }

                if (ChildActivity != null)
                {
                    break;
                }

                var distance = WDist.FromCells(Dock.Info.QueueDistance);

                if ((dockableActor.CenterPosition - DockActor.CenterPosition).Length > distance.Length)
                {
                    QueueChild(new Move(dockableActor, Target.FromActor(DockActor), distance));
                }
                else
                {
                    DockingState = DockingState.Waiting;
                    Dock.Add(dockableActor);
                }

                break;

            case DockingState.Waiting:
                if (State == ActivityState.Canceling)
                {
                    Dock.Remove(dockableActor);
                    return(true);
                }

                break;

            case DockingState.PrepareDocking:
                if (State == ActivityState.Canceling)
                {
                    Dock.Remove(dockableActor);
                    return(true);
                }

                if (ChildActivity != null)
                {
                    break;
                }

                var target = DockActor.World.Map.CellContaining(DockActor.CenterPosition + Dock.Info.Position + Dock.Info.DragOffset);

                if (dockableActor.Location != target)
                {
                    QueueChild(new Move(dockableActor, target));
                }
                else
                {
                    DockingState = DockingState.Docking;

                    QueueChild(new Turn(dockableActor, Dock.Info.Angle));
                    initialPosition = dockableActor.CenterPosition;
                    QueueChild(new Drag(dockableActor, dockableActor.CenterPosition, DockActor.CenterPosition + Dock.Info.Position, Dock.Info.DragLength));
                }

                break;

            case DockingState.Docking:
                if (State == ActivityState.Canceling)
                {
                    StartUndocking();
                    return(false);
                }

                if (ChildActivity == null)
                {
                    DockingState = DockingState.Docked;
                    Dock.OnDock();
                }

                break;

            case DockingState.Docked:
                if (State == ActivityState.Canceling)
                {
                    StartUndocking();
                    return(false);
                }

                break;

            case DockingState.Undocking:
                if (ChildActivity == null)
                {
                    DockingState = DockingState.None;
                    Dock.Remove(dockableActor);

                    if (!DockActor.IsDead && DockActor.IsInWorld)
                    {
                        var rallyPoint = DockActor.TraitOrDefault <RallyPoint>();
                        if (rallyPoint != null && rallyPoint.Path.Any())
                        {
                            foreach (var cell in rallyPoint.Path)
                            {
                                dockableActor.QueueActivity(new Move(dockableActor, cell));
                            }
                        }
                    }
                }

                break;

            case DockingState.None:
                return(true);
            }

            return(false);
        }
示例#20
0
 public void StartUndocking()
 {
     DockingState = DockingState.Undocking;
     QueueChild(new Drag(dockableActor, DockActor.CenterPosition + Dock.Info.Position, initialPosition, Dock.Info.DragLength));
 }
示例#21
0
 public virtual void Show(DockingState state)
 {
     this.mainWindow.Show(this, state);
 }
示例#22
0
 public void StartDocking()
 {
     this.DockingState = DockingState.PrepareDocking;
 }
示例#23
0
    private IEnumerator AutoUndockingRoutine(SpaceStation station)
    {
        //station should undock us in a safe place pointing the right way
        var dest = transform.position + transform.forward * DOCK_DISTANCE;
        var proximity = GetDockProximity();

        while ((ship.transform.position - dest).sqrMagnitude > proximity)
        {
            ship.ResetControls(thrust: 1);
            ship.RotateToPoint(dest);

            yield return null;
        }

        state = DockingState.InSpace;
        localStation = null;

        var shipAi = ship.GetComponent<AITaskFollower>();
        if (shipAi)
        {
            shipAi.ClearTasks();
        }
    }
 void Update()
 {
     switch (curState) {
     case DockingState.instructions1:
     case DockingState.instructions2:
         {
             if (switchToGamePlay) {
                 playerBoat.GetComponent<Rigidbody> ().isKinematic = false;
                 switchToGamePlay = false;
                 curState = DockingState.gameplay;
             }
             break;
         }
     case DockingState.gameplay:
         {
             if (switchToReset) {
                 switchToReset = false;
                 curState = DockingState.reset;
             }
             break;
         }
     case DockingState.reset:
         {
             //				StartCoroutine ("PauseBoats");
             if (switchToGamePlay) {
                 NavBoatControl.s_instance.boomSlider.value = 80f;
                 switchToGamePlay = false;
                 DieOnHitBoat[] arrows = GameObject.FindObjectsOfType<DieOnHitBoat> ();
                 foreach (DieOnHitBoat x in arrows) {
                     x.Reset ();
                 }
                 curState = DockingState.gameplay;
                 StartCoroutine ("HackyBSFix");
             }
             break;
         }
     }
 }
示例#25
0
 public DockData(DockingState dockState, Rectangle location)
 {
     DockState = dockState;
     Location  = location;
 }
示例#26
0
 void Start()
 {
     ship = GetComponent<Ship>();
     localStation = null;
     state = DockingState.InSpace;
 }
示例#27
0
 public override void Cancel(Actor self, bool keepQueue = false)
 {
     dockingState = DockingState.Undock;
     base.Cancel(self);
 }
示例#28
0
    public void BeginAutoDocking(SpaceStation station)
    {
        if (LocalStation != station)
        {
            return;
        }

        state = DockingState.AutoDocking;

        StartCoroutine(AutoDockingRoutine(station));
    }
示例#29
0
 void Start()
 {
     curState = DockingState.briefing;
 }
示例#30
0
        public override bool Tick(Actor self)
        {
            switch (dockingState)
            {
            case DockingState.Wait:
                return(false);

            case DockingState.Turn:
                dockingState = DockingState.Drag;
                QueueChild(new Turn(self, DockAngle));
                return(false);

            case DockingState.Drag:
                if (IsCanceling || !Refinery.IsInWorld || Refinery.IsDead)
                {
                    return(true);
                }

                dockingState = DockingState.Dock;
                if (IsDragRequired)
                {
                    QueueChild(new Drag(self, StartDrag, EndDrag, DragLength));
                }

                return(false);

            case DockingState.Dock:
                if (!IsCanceling && Refinery.IsInWorld && !Refinery.IsDead)
                {
                    OnStateDock(self);
                }
                else
                {
                    dockingState = DockingState.Undock;
                }

                return(false);

            case DockingState.Loop:
                if (IsCanceling || !Refinery.IsInWorld || Refinery.IsDead || Harv.TickUnload(self, Refinery))
                {
                    dockingState = DockingState.Undock;
                }

                return(false);

            case DockingState.Undock:
                OnStateUndock(self);
                return(false);

            case DockingState.Complete:
                Harv.LastLinkedProc = Harv.LinkedProc;
                Harv.LinkProc(self, null);
                if (IsDragRequired)
                {
                    QueueChild(new Drag(self, EndDrag, StartDrag, DragLength));
                }

                return(true);
            }

            throw new InvalidOperationException("Invalid harvester dock state");
        }
    IEnumerator WinReset()
    {
        CameraOverhead ();
        if (SoundtrackManager.s_instance != null)
            SoundtrackManager.s_instance.PlayAudioSource (SoundtrackManager.s_instance.bell);
        yield return new WaitForSeconds (3f);
        if (setup2.activeSelf == false) {
            setup2.SetActive (true);
            setup1.SetActive (false);
            playerBoat.transform.position = setup2transform.position;
            playerBoat.transform.rotation = setup2transform.rotation;

            curState = DockingState.instructions2;
            playerBoat.GetComponent<Rigidbody>().isKinematic = true;
            gameplayUi.SetActive (false);
            parallelMethodUI.SetActive (true);
            instructionsUI.GetComponent<InstructionsPanel>().GoToPanel( instructionsUI.transform.GetChild (0).GetChild(0).gameObject );

        } else {
            curState = DockingState.win;
            if (SoundtrackManager.s_instance != null)
                SoundtrackManager.s_instance.PlayAudioSource (SoundtrackManager.s_instance.bell);
            CongratulationsPopUp.s_instance.InitializeCongratulationsPanel( "Docking" );
        }
    }
示例#32
0
    private void BeginAutoUndocking(SpaceStation station)
    {
        state = DockingState.AutoDocking;

        //make sure our local station is set, so AutoDockingStation points to it
        localStation = station;

        StartCoroutine(AutoUndockingRoutine(station));
    }
示例#33
0
 public override bool Cancel(Actor self)
 {
     dockingState = DockingState.Undock;
     return(base.Cancel(self));
 }
示例#34
0
文件: Docking.cs 项目: spooky/KKnD
        public override bool Tick(Actor self)
        {
            if (!shouldCancel && (DockActor == null || DockActor.IsDead || !DockActor.IsInWorld || Dock.GetDockAction(DockableActor) == null))
            {
                shouldCancel = true;
            }

            if (ChildActivity != null)
            {
                if (shouldCancel)
                {
                    ChildActivity.Cancel(self);
                }

                if (ChildActivity != null)
                {
                    ChildActivity.Tick(self);
                }
            }

            switch (DockingState)
            {
            case DockingState.Approaching:
                if (shouldCancel)
                {
                    DockingState = DockingState.Undocked;
                    break;
                }

                // TODO does not null when target reached...?
                if (ChildActivity != null)
                {
                    break;
                }

                var distance = (DockableActor.CenterPosition - DockActor.CenterPosition).Length;

                if (distance > WDist.FromCells(Dock.Info.QueueDistance).Length)
                {
                    QueueChild(new Move(DockableActor, Target.FromActor(DockActor), WDist.FromCells(Dock.Info.QueueDistance)));
                }
                else
                {
                    DockingState = DockingState.Waiting;
                    Dock.Add(DockableActor);
                }

                break;

            case DockingState.Waiting:
                if (shouldCancel)
                {
                    DockingState = DockingState.Undocked;
                    Dock.Remove(DockableActor);
                }

                break;

            case DockingState.Docking:
                if (ChildActivity == null)
                {
                    if (shouldCancel)
                    {
                        DockingState = DockingState.Undocked;
                        Dock.Remove(DockableActor);
                    }
                    else
                    {
                        DockingState = DockingState.Docked;
                        Dock.OnDock();
                    }
                }

                break;

            case DockingState.Docked:
                if (shouldCancel)
                {
                    StartUndocking();
                }

                break;

            case DockingState.Undocking:
                if (ChildActivity == null)
                {
                    DockingState = DockingState.Undocked;
                    Dock.Remove(DockableActor);

                    if (!DockActor.IsDead && DockActor.IsInWorld)
                    {
                        var rallyPoint = DockActor.TraitOrDefault <RallyPoint>();
                        if (rallyPoint != null && rallyPoint.Path.Any())
                        {
                            DockableActor.QueueActivity(new Move(DockableActor, rallyPoint.Path.First()));
                        }
                    }
                }

                break;

            case DockingState.Undocked:
                break;
            }

            return(DockingState == DockingState.Undocked && ChildActivity == null);
        }
 void Start()
 {
     curState = DockingState.briefing;
 }
示例#36
0
文件: DockData.cs 项目: Aquilon96/ags
 public DockData(DockingState dockState, Rectangle location)
 {
     DockState = dockState;
     Location = location;
 }
示例#37
0
        public override bool Tick(Actor self)
        {
            switch (dockingState)
            {
            case DockingState.Wait:
                return(false);

            case DockingState.Turn:
                dockingState = DockingState.Dock;
                QueueChild(new Turn(self, DockAngle));
                if (IsDragRequired)
                {
                    QueueChild(new Drag(self, StartDrag, EndDrag, DragLength));
                }
                return(false);

            case DockingState.Dock:
                if (Refinery.IsInWorld && !Refinery.IsDead)
                {
                    foreach (var nd in Refinery.TraitsImplementing <INotifyDocking>())
                    {
                        nd.Docked(Refinery, self);
                    }
                }

                OnStateDock(self);
                return(false);

            case DockingState.Loop:
                if (!Refinery.IsInWorld || Refinery.IsDead || Harv.TickUnload(self, Refinery))
                {
                    dockingState = DockingState.Undock;
                }

                return(false);

            case DockingState.Undock:
                OnStateUndock(self);
                return(false);

            case DockingState.Complete:
                if (Refinery.IsInWorld && !Refinery.IsDead)
                {
                    foreach (var nd in Refinery.TraitsImplementing <INotifyDocking>())
                    {
                        nd.Undocked(Refinery, self);
                    }
                }

                Harv.LastLinkedProc = Harv.LinkedProc;
                Harv.LinkProc(self, null);
                if (IsDragRequired)
                {
                    QueueChild(new Drag(self, EndDrag, StartDrag, DragLength));
                }

                return(true);
            }

            throw new InvalidOperationException("Invalid harvester dock state");
        }
示例#38
0
 public override bool Cancel(Actor self, bool keepQueue = false)
 {
     dockingState = DockingState.Undock;
     return(base.Cancel(self));
 }
示例#39
0
    private IEnumerator AutoDockingRoutine(SpaceStation spaceStation)
    {
        var points = spaceStation.UndockPoints.ToList();
        var pointIndex = UnityEngine.Random.Range(0, points.Count);

        var endPoint = points[pointIndex];
        var startPoint = points[pointIndex].position + (endPoint.position - spaceStation.transform.position).normalized * DOCK_DISTANCE; //TODO

        var proximity = GetDockProximity();

        //TODO
        var shipAi = ship.GetComponent<AITaskFollower>();
        if (!shipAi)
        {
            shipAi = ship.gameObject.AddComponent<AITaskFollower>();
            yield return null; //Start() needs to run
        }

        var goToEnd = FlyToPointTask.Create(endPoint.position, proximity);

        shipAi.AssignTask(goToEnd);

        if (!ship.CanSee(endPoint.position) && !goToEnd.Done)
        {
            var goToStart = FlyToPointTask.Create(startPoint, proximity);
            shipAi.AssignTask(goToStart);

            while (!goToStart.Done)
            {
                yield return null;
            }
        }
        
        while (!goToEnd.Done)
        {
            yield return null;
        }

        state = DockingState.Docked;
        spaceStation.AddDockedShip(this);
        
        shipAi.ClearTasks();
    }