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); }