Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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);
        }
    }
Exemplo n.º 3
0
    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);
        }
    }
Exemplo n.º 4
0
    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]);
        }
    }
Exemplo n.º 5
0
    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]);
            }
        }
    }