Example #1
0
        /// <summary>
        /// Register a continuous ring completion check after the preTask ends.
        /// When the checker thinks the ring is O.K. to shut down, it will pull the trigger
        /// of heartbeat node in the ring. Then nodes in the ring will shut down one by one
        /// </summary>
        /// <param name="preTask">The task after which ring check begins</param>
        /// <param name="ringNodes">Child dataflows that forms a ring</param>
        protected async Task RegisterChildRing(Task preTask, params IRingNode[] ringNodes)
        {
            var ring = new RingMonitor(this, ringNodes);
            //todo: check if it is a real ring

            await ring.StartMonitoring(preTask);
        }
    /// <summary>
    /// Ring "Touch End" handler
    /// </summary>
    /// <param name="ring">Ring to handle</param>
    public void RingDropHandler(GameObject ring)
    {
        _RingMovementController.StopObjectMovementHandling();

        if (IsTopRingOnPinSelected(ring))
        {
            Transform holderPin = _PinController.GetPinIfRingOnTop(ring);
            ring.SendMessage("SetCurrentStateNeutral");
            _RingMovementController.enabled = false;
            PinMonitor  pinMonitor          = holderPin.GetComponent <PinMonitor>();
            RingMonitor ringMonitor         = ring.GetComponent <RingMonitor>();
            Vector3     topRingSlotPosition = pinMonitor.GetCurrentTopRingSlotPosition();
            ringMonitor.onMoveComplete += MoveToPositionOnPinHandler;
            ringMonitor.MoveToPosition(topRingSlotPosition, RingMovementTime / ringMonitor.GetRingSize(), true);
        }
        else
        {
            ring.SendMessage("SetCurrentStateSurprised");
        }
    }
Example #3
0
    public bool CanAddRing(GameObject ringToCheck)
    {
        bool       retVal  = false;
        GameObject topRing = PeekTopRing();

        if (topRing != null)
        {
            RingMonitor topRingComponent     = topRing.GetComponent <RingMonitor>();
            RingMonitor ringToCheckComponent = ringToCheck.GetComponent <RingMonitor>();
            if (topRingComponent.GetRingSize() > ringToCheckComponent.GetRingSize())
            {
                retVal = true;
            }
        }
        else
        {
            retVal = true;
        }
        return(retVal);
    }
    /// <summary>
    /// Pin collider touched handler
    /// </summary>
    /// <param name="activeRing">Active ring</param>
    /// <param name="selectedPin">Collided pin</param>
    public void PinSelectHandler(GameObject activeRing, Transform selectedPin)
    {
        _PinController.enabled          = false;
        _RingMovementController.enabled = false;
        _RingMovementController.StopObjectMovementHandling();
        PinMonitor  pinMonitor     = selectedPin.GetComponent <PinMonitor>();
        RingMonitor ringMonitor    = activeRing.GetComponent <RingMonitor>();
        Vector3     moveToPosition = pinMonitor.GetAvailableEmptySlotPosition();

        if (pinMonitor.CanAddRing(activeRing))
        {
            activeRing.SendMessage("SetCurrentStateActive");
            _ActivePinForAirRing = selectedPin;
            activeRing.GetComponent <RingMonitor>().onMoveComplete += MoveToPositionOnPinFromAirHandler;
            activeRing.GetComponent <RingMonitor>().MoveToPosition(moveToPosition, RingMovementTime / ringMonitor.GetRingSize(), true);
        }
        else
        {
            activeRing.SendMessage("SetCurrentStateSad");
            moveToPosition = pinMonitor.GetOverPinPosition();
            activeRing.GetComponent <RingMonitor>().onMoveComplete += MoveToPositionOverPinHandler;
            activeRing.GetComponent <RingMonitor>().MoveToPosition(moveToPosition, RingMovementTime, false);
        }
    }