Exemplo n.º 1
0
        /// <summary>
        /// Gets the nodes and represents them.
        /// </summary>
        public override void SetGraphNodes()
        {
            foreach (FSMState state in this.Configuration.ArrayOfFSMState)
            {
                CustomVertex vertex = new CustomVertex(state.Name, Colors.Wheat, true);
                this.MyGraph.AddVertex(vertex);
            }

            FSMTrigger t = new FSMTrigger();
            try
            {
                foreach (FSMState state in this.Configuration.ArrayOfFSMState)
                {
                    foreach (AllowedTrigger trigger in state.ArrayOfAllowedTrigger)
                    {
                        t = this.Configuration.FoundTriggerInList(trigger);
                        if (string.IsNullOrEmpty(trigger.TriggerName))
                        {
                            this.MyGraph.AddNewEdge(trigger.StateAndTriggerName, this.MyGraph.GetVertexByName(state.Name), this.MyGraph.GetVertexByName(trigger.StateAndTriggerName));
                        }
                        else
                        {
                            this.MyGraph.AddNewEdge(trigger.TriggerName, this.MyGraph.GetVertexByName(state.Name), this.MyGraph.GetVertexByName(trigger.StateName));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
Exemplo n.º 2
0
 protected virtual void Awake()
 {
     _trigger = gameObject.AddComponent <FSMTrigger>();
     _trigger.OnTriggerEnter.AddListener((ent) =>
     {
         if (!EntityEnabled)
         {
             return;
         }
         Fire("OnStartTouch");
         OnStartTouch(ent);
     });
     _trigger.OnTriggerExit.AddListener((ent) =>
     {
         if (!EntityEnabled)
         {
             return;
         }
         Fire("OnEndTouch");
         OnEndTouch(ent);
     });
     _trigger.OnTriggerStay.AddListener((ent) =>
     {
         if (!EntityEnabled)
         {
             return;
         }
         OnTouch(ent);
     });
 }
Exemplo n.º 3
0
    //状态机调用
    public void AddMap(FSMTriggerID triggerID, FSMStateID stateID)
    {
        map.Add(triggerID, stateID);

        Type       type    = Type.GetType(triggerID + "Trigger");
        FSMTrigger trigger = Activator.CreateInstance(type) as FSMTrigger;

        Triggers.Add(trigger);
    }
Exemplo n.º 4
0
        private void CreateTriggerObject(string triggerName)
        {
            //例如:没有血量条件
            //策划配置:NoHealth
            //程序类名:NoHealthTrigger

            //命名空间.类名
            string         className = "Voice." + triggerName + "Trigger";
            Type           type      = Type.GetType(className);
            FSMTrigger <T> obj       = Activator.CreateInstance(type) as FSMTrigger <T>;

            //为条件对象提供状态机引用
            obj.Init(fsm);
            triggers.Add(obj);
        }
Exemplo n.º 5
0
        /*
         * public string[] AllStates
         * {
         *  get
         *  {
         *      List<string> _ret = new List<string>();
         *      _ret.AddRange(states);
         *      foreach (int _key in start.Keys)
         *      {
         *          _ret.Add(start[_key]);
         *      }
         *      foreach (int _key in end.Keys)
         *      {
         *          _ret.AddRange(end[_key]);
         *      }
         *      return _ret.ToArray();
         *  }
         * }
         */

        public FSMSimpleSyntax(string FSMDefinition)
        {
            numberOfMachines = 1;

            Ignores     = new List <FSMIgnore>();
            Transitions = new List <FSMTransition>();
            Operators   = new Dictionary <string, FSMOperator>();

            string[] _lines = FSMDefinition.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            Errors = new List <string>();

            foreach (string _line in _lines)
            {
                var _parsedLine = ParseSimpleSyntaxLine(_line);

                if (_parsedLine != null)
                {
                    #region START-STATE

                    if (_parsedLine.Command.RemoveWhitespace().ToLower().StartsWith("start", StringComparison.OrdinalIgnoreCase))
                    {
                        List <string> _startStates  = _parsedLine.GetStateList1;
                        int           _machineIndex = _parsedLine.Index;

                        if (_machineIndex > numberOfMachines)
                        {
                            numberOfMachines = _machineIndex;
                        }

                        if (!start.ContainsKey(_machineIndex - 1))
                        {
                            start.Add(_machineIndex - 1, "");
                        }

                        if (!states.ContainsKey(_machineIndex - 1))
                        {
                            states.Add(_machineIndex - 1, new List <string>());
                        }

                        if (_startStates.Count == 1 && start[_machineIndex - 1] == "")
                        {
                            start[_machineIndex - 1] = _startStates[0];
                            if (!states[_machineIndex - 1].Contains(_startStates[0]))
                            {
                                states[_machineIndex - 1].Add(_startStates[0]);
                            }
                        }
                        else
                        {
                            Errors.Add("More than one start state defined.");
                        }
                    }
                    #endregion

                    #region END-STATES

                    if (_parsedLine.Command.RemoveWhitespace().ToLower().StartsWith("end", StringComparison.OrdinalIgnoreCase))
                    {
                        List <string> _endStates    = _parsedLine.GetStateList1;
                        int           _machineIndex = _parsedLine.Index;
                        if (_machineIndex > numberOfMachines)
                        {
                            numberOfMachines = _machineIndex;
                        }

                        if (!end.ContainsKey(_machineIndex))
                        {
                            end.Add(_machineIndex, new string[] { });
                        }

                        end[_machineIndex] = _endStates.ToArray();

                        if (!states.ContainsKey(_machineIndex - 1))
                        {
                            states.Add(_machineIndex - 1, new List <string>());
                        }

                        foreach (string s in _endStates)
                        {
                            if (!states[_machineIndex - 1].Contains(s))
                            {
                                states[_machineIndex - 1].Add(s);
                            }
                        }
                    }
                    #endregion

                    #region TRANSITIONS
                    if (_parsedLine.Command.RemoveWhitespace().ToLower().StartsWith("transition", StringComparison.OrdinalIgnoreCase))
                    {
                        int _machineIndex = _parsedLine.Index;
                        if (_machineIndex > numberOfMachines)
                        {
                            numberOfMachines = _machineIndex;
                        }

                        List <string> _listOfFromStates = _parsedLine.GetStateList1;
                        List <string> _lisOfToStates    = _parsedLine.GetStateList2;

                        if (_parsedLine.Trigger == "")
                        {
                            _parsedLine.Trigger = "EventName=";
                        }

                        List <string> _listOfTriggerStrings = _parsedLine.Trigger.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>();
                        List <string> _guards    = _parsedLine.Guard.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>();
                        List <string> _operators = _parsedLine.Operator.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>();

                        if (!states.ContainsKey(_machineIndex - 1))
                        {
                            states.Add(_machineIndex - 1, new List <string>());
                        }

                        foreach (string _trigger in _listOfTriggerStrings)
                        {
                            FSMTrigger _fsmtrigger = new FSMTrigger(_trigger.Trim(), _parsedLine.Guard, _parsedLine.Operator, _machineIndex - 1, "");

                            if (!triggers.ContainsKey(_fsmtrigger.GetTriggerName))
                            {
                                triggers.Add(_fsmtrigger.GetTriggerName, _fsmtrigger);
                            }
                            else
                            {
                                _fsmtrigger = triggers[_fsmtrigger.GetTriggerName];
                            }

                            foreach (string _from in _listOfFromStates)
                            {
                                if (!_fsmtrigger.States.Contains(_from + "_logfsm_id_" + (_machineIndex - 1)))
                                {
                                    _fsmtrigger.States.Add(_from + "_logfsm_id_" + (_machineIndex - 1));
                                }

                                FSMOperator _fsmoperator = new FSMOperator()
                                {
                                    OperatorString = _parsedLine.Operator, State = _from, TriggerName = _fsmtrigger.GetTriggerName, MachineIndex = _machineIndex - 1
                                };

                                string _key = _fsmoperator.GetKey.RemoveWhitespace() + CreateValidIdentifier(_parsedLine.Guard);
                                if (!Operators.ContainsKey(_key))
                                {
                                    Operators.Add(_key, _fsmoperator);
                                }
                                else
                                {
                                    Errors.Add("Operator already defined (state: " + _from + ", trigger: " + _parsedLine.Trigger.Trim() + ", machine: " + _machineIndex + ")");
                                }

                                foreach (string _to in _lisOfToStates)
                                {
                                    if (_from.Trim() != _to.Trim())
                                    {
                                        FSMTransition _t = new FSMTransition()
                                        {
                                            MachineIndex = _machineIndex - 1,
                                            From         = _from.Trim(),
                                            To           = _to.Trim()
                                        };

                                        if (!states[_machineIndex - 1].Contains(_from.Trim()))
                                        {
                                            states[_machineIndex - 1].Add(_from.Trim());
                                        }

                                        if (!states[_machineIndex - 1].Contains(_to.Trim()))
                                        {
                                            states[_machineIndex - 1].Add(_to.Trim());
                                        }

                                        _t.Triggers.Add(_fsmtrigger);

                                        Transitions.Add(_t);
                                    }
                                    else
                                    {
                                        FSMIgnore _i = new FSMIgnore()
                                        {
                                            MachineIndex = _machineIndex - 1,
                                            State        = _from.Trim(),
                                        };

                                        if (!states[_machineIndex - 1].Contains(_from.Trim()))
                                        {
                                            states[_machineIndex - 1].Add(_from.Trim());
                                        }

                                        _i.Triggers.Add(_fsmtrigger);

                                        Ignores.Add(_i);
                                    }
                                }
                            }
                        }
                    }
                    #endregion

                    #region IGNORE
                    if (_parsedLine.Command.RemoveWhitespace().ToLower().StartsWith("ignore", StringComparison.OrdinalIgnoreCase))
                    {
                        int _machineIndex = _parsedLine.Index;
                        if (_machineIndex > numberOfMachines)
                        {
                            numberOfMachines = _machineIndex;
                        }

                        List <string> _listOfIgnoredStates = _parsedLine.GetStateList1;

                        List <string> _listOfTriggerStrings = _parsedLine.Trigger.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>();
                        List <string> _guards    = _parsedLine.Guard.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>();
                        List <string> _operators = _parsedLine.Operator.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>();

                        if (!states.ContainsKey(_machineIndex - 1))
                        {
                            states.Add(_machineIndex - 1, new List <string>());
                        }

                        foreach (string _trigger in _listOfTriggerStrings)
                        {
                            FSMTrigger _fsmtrigger = new FSMTrigger(_trigger.Trim(), _parsedLine.Guard, _parsedLine.Operator, _machineIndex - 1, "");

                            if (!triggers.ContainsKey(_fsmtrigger.GetTriggerName))
                            {
                                triggers.Add(_fsmtrigger.GetTriggerName, _fsmtrigger);
                            }
                            else
                            {
                                _fsmtrigger = triggers[_fsmtrigger.GetTriggerName];
                            }


                            foreach (string _state in _listOfIgnoredStates)
                            {
                                if (!_fsmtrigger.States.Contains(_state + "_logfsm_id_" + (_machineIndex - 1)))
                                {
                                    _fsmtrigger.States.Add(_state + "_logfsm_id_" + (_machineIndex - 1));
                                }


                                FSMOperator _fsmoperator = new FSMOperator()
                                {
                                    OperatorString = _parsedLine.Operator, State = _state, TriggerName = _fsmtrigger.GetTriggerName, MachineIndex = _machineIndex - 1
                                };

                                string _key = _fsmoperator.GetKey;
                                if (!Operators.ContainsKey(_key))
                                {
                                    Operators.Add(_key, _fsmoperator);
                                }
                                else
                                {
                                    Errors.Add("Operator already defined (state: " + _state + ", trigger: " + _parsedLine.Trigger.Trim() + ", machine: " + _machineIndex + ")");
                                }

                                FSMIgnore _i = new FSMIgnore()
                                {
                                    MachineIndex = _machineIndex - 1,
                                    State        = _state.Trim(),
                                };

                                if (!states[_machineIndex - 1].Contains(_state.Trim()))
                                {
                                    states[_machineIndex - 1].Add(_state.Trim());
                                }

                                _i.Triggers.Add(_fsmtrigger);

                                Ignores.Add(_i);
                            }
                        }
                    }
                    #endregion
                }
                else
                {
                    Errors.Add("Error parsing line:" + _line);
                }
            }
        }
Exemplo n.º 6
0
        public FSMSequence AddNewStep(FSMSequence sequence, string steppTrigger)
        {
            FSMStep step = new FSMStep();
            FSMTrigger triig = new FSMTrigger();
            triig = this.Configuration.FoundStringTriggerList(steppTrigger);
            if (string.IsNullOrEmpty(triig.SequenceID))
            {
                step.Name = triig.CommonID;
            }
            else
            {
                step.Name = triig.SequenceID;
            }

            step.Weight = "2";
            step.TimeoutInSeconds = " 2";
            if (!string.IsNullOrEmpty(step.Name))
            {
                sequence.ArrayOfStep.Add(step);
            }

            return sequence;
        }
Exemplo n.º 7
0
        /// <summary>
        /// Adds a new edge, a new allowed trigger to source vertex, a new trigger if it doesn't exist.
        /// </summary>
        /// <param name="vertexFrom">The vertex from.</param>
        /// <param name="trigger">The trigger.</param>
        /// <param name="vertexTo">The vertex to.</param>
        public override void AddNewEdge(CustomVertex vertexFrom, string trigger, CustomVertex vertexTo)
        {
            FSMState state = new FSMState();
            FSMControl.DomainModel.FirstVersion.AllowedTrigger aw = new FSMControl.DomainModel.FirstVersion.AllowedTrigger();
            FSMTrigger trig = new FSMTrigger();
            state.Name = vertexFrom.Text;
            if (string.IsNullOrEmpty(trigger))
            {
                this.MyGraph.AddNewEdge(vertexTo.Text, vertexFrom, vertexTo);
                aw.StateAndTriggerName = trig.CommonID = vertexTo.Text;
            }
            else
            {
                this.MyGraph.AddNewEdge(vertexTo.Text, vertexFrom, vertexTo);
                aw.StateName = vertexTo.Text;
                aw.TriggerName = trigger;
                trig.Name = vertexTo.Text;
                trig.SequenceID = trigger;
            }

            foreach (var item in this.Configuration.ArrayOfFSMState)
            {
                if (item.Name == state.Name)
                {
                    if (item.ArrayOfAllowedTrigger == null)
                    {
                        item.ArrayOfAllowedTrigger = new Collection<FSMControl.DomainModel.FirstVersion.AllowedTrigger>();
                    }

                    item.ArrayOfAllowedTrigger.Add(aw);
                    break;
                }
            }

            this.Configuration.AddNewTrigger(trig);
        }