コード例 #1
0
    public List <CinematicAction> ParseCinematic(string blob)
    {
        List <CinematicAction> actions        = new List <CinematicAction>();
        List <CinematicAction> subActionStack = new List <CinematicAction>();
        CinematicAction        previousAction = null;
        bool inMultiLineComment = false;

        string[] lines = blob.Split(new char[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
        for (int i = 0; i < lines.Length; ++i)
        {
            string line = lines[i].Trim();
            if (line.Length == 0 || line.StartsWith("//"))
            {
                // do nothing - ignore the line
            }
            else if (line.StartsWith("/*"))
            {
                inMultiLineComment = true;
            }
            else if (line.EndsWith("*/"))
            {
                inMultiLineComment = false;
            }
            else if (inMultiLineComment)
            {
                // do nothing - we're in a comment
            }
            else if (line == "{")
            {
                Debug.Assert(previousAction != null);
                subActionStack.Add(previousAction);
            }
            else if (line == "}")
            {
                subActionStack.RemoveAt(subActionStack.Count - 1);
            }
            else
            {
                string[] symbols = line.Split(new char[] { ' ' }, 2, System.StringSplitOptions.RemoveEmptyEntries);

                string actionName = symbols[0].Trim();

                if (!mActionFactory.ActionExists(actionName))
                {
                    Debug.LogError("Action does not exist: " + actionName);
                }

                CinematicAction newAction = mActionFactory.ConstructNewActionByName(actionName);
                Debug.Assert(newAction != null, actionName);

                if (symbols.Length > 1)
                {
                    List <string> parameterList = SplitParameterList(symbols[1].Trim());

                    bool simpleParameter = (parameterList.Count == 1 && !parameterList[0].Contains(":"));

                    Dictionary <string, string> parameters = new Dictionary <string, string>();
                    newAction.alias = actionName;

                    if (simpleParameter)
                    {
                        parameters.Add(newAction.simpleParameterName, parameterList[0]);
                    }
                    else
                    {
                        for (int parameterIdx = 0; parameterIdx < parameterList.Count; ++parameterIdx)
                        {
                            string[] parameterKeyValue = parameterList[parameterIdx].Split(new char[] { ':' });
                            string   key   = parameterKeyValue[0].Trim();
                            string   value = parameterKeyValue[1].Trim();
                            parameters.Add(key, value);
                        }
                    }

                    newAction.SetParameters(parameters);
                }

                previousAction = newAction;

                if (subActionStack.Count > 0)
                {
                    CinematicAction parent = subActionStack[subActionStack.Count - 1];
                    newAction.parentAction = parent;

                    parent.AddChildAction(newAction);
                }
                else
                {
                    actions.Add(newAction);
                }
            }
        }

        return(actions);
    }