Example #1
0
        private ExpressionGroup Parse(string input)
        {
            var tokenizer = Tokenizer.CreateTokenizer(input);
            var parser    = new AchievementScriptParser();

            return(parser.Parse(tokenizer));
        }
Example #2
0
        /// <summary>
        /// Processes the provided script.
        /// </summary>
        /// <returns>
        /// <c>true</c> if the script was successfully processed,
        /// <c>false</c> if not - in which case <see cref="ErrorMessage"/> will indicate why.
        /// </returns>
        public bool Run(Tokenizer input)
        {
            var expressionGroup = new AchievementScriptParser().Parse(input);

            if (expressionGroup.Comments.Count > 0)
            {
                GameTitle = expressionGroup.Comments[0].Value.Substring(2).Trim();

                foreach (var comment in expressionGroup.Comments)
                {
                    if (comment.Value.Contains("#ID"))
                    {
                        ExtractGameId(new Token(comment.Value, 0, comment.Value.Length));
                        break;
                    }
                }
            }

            InterpreterScope scope;

            return(Run(expressionGroup, out scope));
        }
Example #3
0
        protected override void OnUpdateSyntax(ContentChangedEventArgs e)
        {
            var parser = new AchievementScriptParser();

            _parsedContent = parser.Parse(Tokenizer.CreateTokenizer(e.Content));

            if (e.IsAborted)
            {
                return;
            }

            var interpreter = new AchievementScriptInterpreter();

            interpreter.Run(_parsedContent, out _scope);

            if (e.IsAborted)
            {
                return;
            }

            ServiceRepository.Instance.FindService <IBackgroundWorkerService>().InvokeOnUiThread(() =>
            {
                ErrorsToolWindow.References.Clear();
                foreach (var error in _parsedContent.Errors)
                {
                    string message = error.Message;

                    var innerError = error;
                    if (innerError.InnerError != null)
                    {
                        do
                        {
                            innerError = innerError.InnerError;
                        } while (innerError.InnerError != null);

                        if (error.Line != innerError.Line || error.Column != innerError.Column)
                        {
                            message += String.Format(" (called from {0}:{1})", error.Line, error.Column);
                        }
                    }

                    ErrorsToolWindow.References.Add(new CodeReferenceViewModel
                    {
                        StartLine   = innerError.Line,
                        StartColumn = innerError.Column,
                        EndLine     = innerError.EndLine,
                        EndColumn   = innerError.EndColumn,
                        Message     = message
                    });
                }
            });

            if (e.IsAborted)
            {
                return;
            }

            if (e.IsWhitespaceOnlyChange)
            {
                return;
            }

            // wait a short while before updating the editor list
            ServiceRepository.Instance.FindService <ITimerService>().Schedule(() =>
            {
                if (e.IsAborted)
                {
                    return;
                }

                _owner.PopulateEditorList(interpreter);
            }, TimeSpan.FromMilliseconds(700));

            base.OnUpdateSyntax(e);
        }
Example #4
0
        private void OpenFile(string filename)
        {
            if (!File.Exists(filename))
            {
                MessageBoxViewModel.ShowMessage("Could not open " + filename);
                return;
            }

            int    line           = 1;
            int    column         = 1;
            string selectedEditor = null;

            if (Game != null && Game.Script.Filename == filename)
            {
                if (Game.Script.CompareState == GeneratedCompareState.LocalDiffers)
                {
                    var vm = new MessageBoxViewModel("Revert to the last saved state? Your changes will be lost.");
                    vm.DialogTitle = "Revert Script";
                    if (vm.ShowOkCancelDialog() == DialogResult.Cancel)
                    {
                        return;
                    }
                }

                // capture current location so we can restore it after refreshing
                line           = Game.Script.Editor.CursorLine;
                column         = Game.Script.Editor.CursorColumn;
                selectedEditor = Game.SelectedEditor.Title;
            }
            else if (!CloseEditor())
            {
                return;
            }

            var  backupFilename = ScriptViewModel.GetBackupFilename(filename);
            bool usingBackup    = false;

            if (File.Exists(backupFilename))
            {
                var vm2 = new MessageBoxViewModel("Found an autosave file from " + File.GetLastWriteTime(backupFilename) + ".\nDo you want to open it instead?");
                vm2.DialogTitle = Path.GetFileName(filename);
                switch (vm2.ShowYesNoCancelDialog())
                {
                case DialogResult.Cancel:
                    return;

                case DialogResult.Yes:
                    filename    = backupFilename;
                    usingBackup = true;
                    break;

                default:
                    break;
                }
            }

            var logger = ServiceRepository.Instance.FindService <ILogService>().GetLogger("RATools");

            logger.WriteVerbose("Opening " + filename);

            string content;

            try
            {
                content = File.ReadAllText(filename);
            }
            catch (IOException ex)
            {
                MessageBoxViewModel.ShowMessage(ex.Message);
                return;
            }

            var tokenizer       = Tokenizer.CreateTokenizer(content);
            var expressionGroup = new AchievementScriptParser().Parse(tokenizer);

            int gameId    = 0;
            var idComment = expressionGroup.Comments.FirstOrDefault(c => c.Value.Contains("#ID"));

            if (idComment != null)
            {
                var tokens = idComment.Value.Split('=');
                if (tokens.Length > 1)
                {
                    Int32.TryParse(tokens[1].ToString(), out gameId);
                }
            }

            if (gameId == 0)
            {
                logger.WriteVerbose("Could not find game ID");
                MessageBoxViewModel.ShowMessage("Could not find game id");
                return;
            }

            if (!usingBackup)
            {
                AddRecentFile(filename);
            }

            logger.WriteVerbose("Game ID: " + gameId);

            var           gameTitle = expressionGroup.Comments[0].Value.Substring(2).Trim();
            GameViewModel viewModel = null;

            foreach (var directory in ServiceRepository.Instance.FindService <ISettings>().DataDirectories)
            {
                var notesFile = Path.Combine(directory, gameId + "-Notes2.txt");
                if (File.Exists(notesFile))
                {
                    logger.WriteVerbose("Found code notes in " + directory);

                    viewModel = new GameViewModel(gameId, gameTitle, directory.ToString());
                }
                else
                {
                    notesFile = Path.Combine(directory, gameId + "-Notes.json");
                    if (File.Exists(notesFile))
                    {
                        logger.WriteVerbose("Found code notes in " + directory);

                        viewModel = new GameViewModel(gameId, gameTitle, directory.ToString());
                    }
                }
            }

            if (viewModel == null)
            {
                logger.WriteVerbose("Could not find code notes");
                MessageBoxViewModel.ShowMessage("Could not locate notes file for game " + gameId);

                viewModel = new GameViewModel(gameId, gameTitle);
            }

            var existingViewModel = Game as GameViewModel;

            // if we're just refreshing the current game script, only update the script content,
            // which will be reprocessed and update the editor list. If it's not the same script,
            // or notes have changed, use the new view model.
            if (existingViewModel != null && existingViewModel.GameId == viewModel.GameId &&
                existingViewModel.Script.Filename == filename &&
                existingViewModel.Notes.Count == viewModel.Notes.Count)
            {
                existingViewModel.Script.SetContent(content);
                viewModel = existingViewModel;

                existingViewModel.SelectedEditor = Game.Editors.FirstOrDefault(e => e.Title == selectedEditor);
                existingViewModel.Script.Editor.MoveCursorTo(line, column, Jamiras.ViewModels.CodeEditor.CodeEditorViewModel.MoveCursorFlags.None);
            }
            else
            {
                if (usingBackup)
                {
                    viewModel.Script.Filename = Path.GetFileName(filename);
                    var title = viewModel.Title + " (from backup)";
                    viewModel.SetValue(GameViewModel.TitleProperty, title);
                }
                else
                {
                    viewModel.Script.Filename = filename;
                }

                viewModel.Script.SetContent(content);
                Game = viewModel;
            }

            if (viewModel.Script.Editor.ErrorsToolWindow.References.Count > 0)
            {
                viewModel.Script.Editor.ErrorsToolWindow.IsVisible = true;
            }
        }