public LuaRoutine(ScripterRoutine routine) { Name = routine.Name; _switch = new LuaIf(); _currentScope = new LuaIfScope { Condition = $"STATE == {GetNextStateIdx()}", }; Lines.Add(_switch); _switch.Scopes.Add(_currentScope); // All routine commands are in states for (var i = 0; i < routine.Lines.Count; i++) { var line = routine.Lines[i]; TranslateLine(line, i); } }
/// <summary> /// Parses a header. Sets parser state accordingly. /// </summary> /// <remarks> /// A header is in the following format /// [headerName, param1, param2, ...] /// /// So for example /// [objects] /// /// Or more complex /// [routine,_Routine1,1,true] /// </remarks> /// <param name="line">The header line</param> private void ParseHeaders(string line) { _currentHeading = line .Trim('[', ']') .Split(',') .Select(x => x.Trim()) .ToArray(); Validate("A heading must have at least one value in it", () => _currentHeading.Length > 0); _state = _currentHeading[0] switch { "objects" => ParserState.Objects, "positions" => ParserState.Positions, "variables" => ParserState.Variables, "text" => ParserState.Text, "routine" => ParserState.Routines, _ => ParserState.Invalid }; Validate($"Current heading produced invalid state {line}", () => _state != ParserState.Invalid); // Check if we are a new routine, if so populate current routine if (_state == ParserState.Routines) { if (_currentRoutine != null) { _currentRoutine.EndLineNumber = _lineNo - 1; } // Routine is in format [routine,ROUTINE_NAME,1,ACTIVE_ON_START] _currentRoutine = new ScripterRoutine { Name = _currentHeading[1], GlobalRoutineSpeed = int.Parse(_currentHeading[2]), GlobalRoutinePriority = bool.Parse(_currentHeading[3]), LineNumber = _lineNo, }; Routines.Add(_currentRoutine); } }