/// <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"); } }
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); } }