public static HSMState <TState, TTrigger> BuildFromAsset(HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> rootAsset) { var relationDictionary = new Dictionary <HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger>, HSMState <TState, TTrigger> >(); GetUniqueStates(relationDictionary, rootAsset); BuildHierarchy(relationDictionary, rootAsset); BuildTransitions(relationDictionary, rootAsset); SetInitialStates(relationDictionary, rootAsset); HSMState <TState, TTrigger> rootState = relationDictionary[rootAsset]; return(rootState); }
private static void BuildTransitions(Dictionary <HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger>, HSMState <TState, TTrigger> > relationDictionary, HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> baseAsset) { HSMState <TState, TTrigger> currentState = relationDictionary[baseAsset]; for (int j = 0; j < baseAsset.transitions.Length; j++) { HSMTransition <TState, TTrigger> transition = baseAsset.transitions[j].ToHSMTransition(); currentState.MakeChildTransition(transition.stateFrom, transition.trigger, transition.stateTo); } for (int i = 0; i < baseAsset.childs.Length; i++) { HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> currentAssetChild = baseAsset.childs[i]; BuildTransitions(relationDictionary, currentAssetChild); } }
private static void BuildHierarchy(Dictionary <HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger>, HSMState <TState, TTrigger> > relationDictionary, HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> baseAsset) { HSMState <TState, TTrigger> currentState = relationDictionary[baseAsset]; for (int i = 0; i < baseAsset.parallelChilds.Length; i++) { HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> currentAssetChild = baseAsset.parallelChilds[i]; currentState.AddParallelChild(relationDictionary[currentAssetChild]); BuildHierarchy(relationDictionary, currentAssetChild); } for (int i = 0; i < baseAsset.childs.Length; i++) { HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> currentAssetChild = baseAsset.childs[i]; currentState.AddChild(relationDictionary[currentAssetChild]); BuildHierarchy(relationDictionary, currentAssetChild); } }
private static void GetUniqueStates(Dictionary <HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger>, HSMState <TState, TTrigger> > relationDictionary, HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> baseAsset) { if (relationDictionary.ContainsKey(baseAsset) == false) { relationDictionary.Add(baseAsset, baseAsset.CreateConcreteHSMState()); } for (int i = 0; i < baseAsset.parallelChilds.Length; i++) { GetUniqueStates(relationDictionary, baseAsset.parallelChilds[i]); } for (int i = 0; i < baseAsset.childs.Length; i++) { GetUniqueStates(relationDictionary, baseAsset.childs[i]); } }
private static void SetInitialStates(Dictionary <HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger>, HSMState <TState, TTrigger> > relationDictionary, HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> baseAsset) { HSMState <TState, TTrigger> currentState = relationDictionary[baseAsset]; if (baseAsset.childs.Length > 0) { currentState.SetInitialState(baseAsset.childs[baseAsset.startStateIndex].stateId); for (int i = 0; i < baseAsset.childs.Length; i++) { SetInitialStates(relationDictionary, baseAsset.childs[i]); } } }