// ---------------------------------------------------------------------------------------------------- // Smoothly transfers instructors to specified transition // ---------------------------------------------------------------------------------------------------- public void AddTransition(Transition _transition) { // First checks if we are not adding the same transition as we last added if ((m_TransitionCount == 0 && m_Containers[_transition.Priority] == _transition) || (m_TransitionCount > 0 && m_Transitions[m_TransitionCount - 1].Container == _transition)) { // Well, nothing to do here } else if (HigherPrioritiesBeingReleased(_transition.m_Priority)) { InitContainer(_transition); m_Transitions[m_TransitionCount] = new TransitionInformation( _transition, _transition.m_Priority, _transition.Time, ContainerPriority.None); m_TransitionCount++; } else if (_transition.m_Priority < m_Priority) { InitContainer(_transition); m_Containers[_transition.m_Priority] = _transition; } else { InsertTransition(_transition, _transition.Priority, _transition.Time, ContainerPriority.None); } }
// ---------------------------------------------------------------------------------------------------- // Inserts transition in list after its corresponding priority // ---------------------------------------------------------------------------------------------------- private void InsertTransition(InstructorContainer _container, int _priority, float _time, int _priorityRelease) { int insertionPriority = _priorityRelease != ContainerPriority.None ? _priorityRelease : _priority; for (int i = 0; i < m_TransitionCount; i++) { if (m_Transitions[i].Priority > insertionPriority) { Assertion.Assert(i < InstructorProcessor.m_TransitionMaxCount - 1, "Transition list is full, cannot insert."); for (int j = InstructorProcessor.m_TransitionMaxCount - 1; j > i; j--) { m_Transitions[j] = m_Transitions[j - 1]; } InitContainer(_container); m_Transitions[i] = new TransitionInformation(_container, _priority, _time, _priorityRelease); m_TransitionCount++; break; } } }
// ---------------------------------------------------------------------------------------------------- // Releases specified priority if no one has overriden it yet // ---------------------------------------------------------------------------------------------------- public void ReleasePriority(Transition _transition) { Assertion.Assert(_transition.m_Priority != ContainerPriority.None, "Cannot release priority 0, logic error."); // Only release priority if there are no other transitions following it with higher or equal priority // or if it has already been overriden in the containers if (IsLastAddedTransition(_transition)) { if (m_Priority > _transition.m_Priority) { ReleasePriorityCut(_transition); } else { InstructorContainer lastContainer; for (int i = _transition.m_Priority - 1; i >= 0; i--) { lastContainer = GetLastContainer(i); if (lastContainer != null) { if (HigherPriorityInList(_transition.m_Priority)) { InsertTransition(lastContainer, i, _transition.Time, _transition.Priority); } else { m_Transitions[m_TransitionCount] = new TransitionInformation(lastContainer, i, _transition.Time, _transition.Priority); m_TransitionCount++; } break; } } } } }