Example #1
0
 private string ParseOptionCommand(PlayerGameSave gameSave, string command)
 {
     if (command.EndsWith("]"))
     {
         var commandSplit = command.Split('[', ']');
         commandSplit = commandSplit.Where(a => !string.IsNullOrWhiteSpace(a)).ToArray();
         var result = ResolveCommand(gameSave, commandSplit[0]);
         if (result)
         {
             return(commandSplit[1]);
         }
     }
     else
     {
         var result = ResolveCommand(gameSave, command);
         if (result)
         {
             return("#TRUE");
         }
         else
         {
             return("#FALSE");
         }
     }
     return(null);
 }
Example #2
0
 private bool ResolveOperation(string data1, string data2, string operat, PlayerGameSave gameSave)
 {
     data1 = ResolveValue(data1, gameSave);
     data2 = ResolveValue(data2, gameSave);
     if (operat == ">")
     {
         if (!int.TryParse(data1, out int data1int))
         {
             throw new ArgumentException($"{data1} was tried to be operated on in a '>' command, but it is not a number!");
         }
         if (!int.TryParse(data2, out int data2int))
         {
             throw new ArgumentException($"{data2} was tried to be operated on in a '>' command, but it is not a number!");
         }
         return(data1int > data2int);
     }
     if (operat == "<")
     {
         if (!int.TryParse(data1, out int data1int))
         {
             throw new ArgumentException($"{data1} was tried to be operated on in a '<' command, but it is not a number!");
         }
         if (!int.TryParse(data2, out int data2int))
         {
             throw new ArgumentException($"{data2} was tried to be operated on in a '<' command, but it is not a number!");
         }
         return(data1int < data2int);
     }
     if (operat == "=")
     {
         return(data1 == data2);
     }
     throw new ArgumentException($"Found a command with an operator {operat} which is not valid");
 }
        public void SaveCurrentGame(Player player, string name = "")
        {
            PlayerGameSave gameSave = new PlayerGameSave
            {
                GameName     = player.ActiveGameSave.GameName,
                GameSaveData = player.ActiveGameSave.GameSaveData.Select(a => new PlayerGameSaveData
                {
                    Name  = a.Name,
                    Value = a.Value,
                }).ToList(),
                StateId = player.ActiveGameSave.StateId,
            };

            var addedSave = _context.PlayerGameSave.Add(gameSave);

            addedSave.Entity.FrameStack = player.ActiveGameSave.FrameStack.Select(a => new PlayerFrameStack
            {
                CreatedDate   = a.CreatedDate,
                FunctionName  = a.FunctionName,
                ReturnStateId = a.ReturnStateId,
                Save          = addedSave.Entity,
                SaveId        = addedSave.Entity.SaveId,
            }).ToList();

            player.GameSaves.Add(new GameSaves {
                PlayerGameSave = addedSave.Entity, Name = name
            });
        }
        private void ReportError(string text, PlayerGameSave gameSave, DrawGame game)
        {
            var state = game.FindStateById(gameSave.StateId);
            var mText = $"Error '{text}' \nIn state with text: '{(!string.IsNullOrWhiteSpace(state.StateText) && state.StateText.Length >= 300 ? state.StateText.Substring(0, 300) : state.StateText)}'";

            errors.Add(mText);
        }
Example #5
0
        public static ExecutionResult LaunchGameForPlayer(DrawGame game, PlayerGameSave save, Player player, IGameProcessor gameProcessor)
        {
            player.ActiveGameSave = new PlayerGameSave
            {
                GameName = game.GameName,
                StateId  = game.StartState.Id,
            };

            var messages = gameProcessor.RecursivelyHandleStates(game.StartState, player.ActiveGameSave, player, game, true);

            messages.Messages.Reverse();

            player.ActiveGameSave = new PlayerGameSave
            {
                GameName = game.GameName,
                StateId  = messages.EndingState.Id,
            };

            player.PlayerFlag = PlayerFlag.IN_GAME.ToString();
            var execResult = new ExecutionResult {
                MessagesToShow = messages.Item1, OptionsToShow = gameProcessor.GetCurrentOptions(player.ActiveGameSave, game)
            };

            return(execResult);
        }
 public static string MakeMessage(Exception e, PlayerGameSave gameSave, string additional = "")
 {
     return(MakeMessage(e, new PlayerState {
         player = new Player {
             ActiveGameSave = gameSave
         }
     }, additional));
 }
Example #7
0
 public ParsedStateOption ResolveOption(PlayerGameSave gameSave, string optionText)
 {
     try
     {
         optionText = CleanText(optionText);
         optionText = optionText.Trim(' ', '\n');
         //if (optionText.Contains("<") || optionText.Contains(">"))
         //    Log.LogMessage($"Potential HTML in option text: '{optionText}' at state with id '{gameSave.StateId}' in game '{gameSave.GameName}'", LogType.Important);
         if (optionText.StartsWith("#if"))
         {
             var result = ParseLine(gameSave, ParseOptionCommand(gameSave, optionText));
             ParsedStateOption option = new ParsedStateOption {
                 OptionType = OptionType.Normal, text = result
             };
             if (result == "#TRUE")
             {
                 option.IsDirectTransition            = true;
                 option.DirectTransitionCommandResult = true;
             }
             else if (result == "#FALSE")
             {
                 option.IsDirectTransition            = true;
                 option.DirectTransitionCommandResult = false;
             }
             return(option);
         }
         else if (optionText.StartsWith("#fallback"))
         {
             var result = ParseLine(gameSave, optionText.Replace("#fallback", "").Replace("[", "").Replace("]", "").Trim(' '));
             if (string.IsNullOrWhiteSpace(result))
             {
                 return new ParsedStateOption {
                            OptionType = OptionType.Fallback, IsDirectTransition = true, DirectTransitionCommandResult = true
                 }
             }
             ;
             else
             {
                 return new ParsedStateOption {
                            OptionType = OptionType.Fallback, text = result
                 }
             };
         }
         else
         {
             var result = ParseLine(gameSave, optionText);
             return(new ParsedStateOption {
                 OptionType = OptionType.Normal, text = result
             });
         }
     } catch (Exception e)
     {
         HandleError(optionText, e, gameSave);
         return(null);
     }
 }
Example #8
0
        private string ParseWord(PlayerGameSave gameSave, string word)
        {
            var trimmed = word.Trim(' ');

            if (trimmed.Substring(0, 1) == "#")
            {
                return(ParseCommad(gameSave, trimmed));
            }
            return(_gameDataService.GetData(gameSave, word));
        }
Example #9
0
 public void SaveData(PlayerGameSave data, string dataName, string valueSet)
 {
     DeleteData(data, dataName);
     data.GameSaveData.Add(new PlayerGameSaveData
     {
         Name  = dataName,
         Value = valueSet,
         PlayerGameSaveSaveId = data.SaveId
     });
 }
Example #10
0
 public string ParseText(PlayerGameSave gameSave, string text)
 {
     try
     {
         return(ParseLine(gameSave, text));
     }
     catch (Exception e)
     {
         HandleError(text, e, gameSave);
         return(null);
     }
 }
Example #11
0
 public bool ResolveCommand(PlayerGameSave gameSave, string command)
 {
     command = CleanText(command);
     command = command.Trim(' ');
     if (command.StartsWith("#if"))
     {
         return(ResolveIf(gameSave, command));
     }
     if (command.StartsWith("#else"))
     {
         return(true);
     }
     throw new ApplicationException("Error parsing: " + command);
 }
Example #12
0
        private string ParseCommad(PlayerGameSave gameSave, string command)
        {
            var commandSplit = command.Split('[', ']');

            commandSplit = commandSplit.Where(a => !string.IsNullOrWhiteSpace(a)).ToArray();
            for (int i = 0; i < commandSplit.Length; i = i + 2)
            {
                var result = ResolveCommand(gameSave, commandSplit[i]);
                if (result)
                {
                    return(commandSplit[i + 1]);
                }
            }
            return(null);
        }
Example #13
0
 public void IncrementData(PlayerGameSave data, string dataName)
 {
     if (!data.GameSaveData.Any(a => a.Name == dataName))
     {
         throw new AdventureGameException("Attempted to increment: " + dataName + " But that data does not exist!");
     }
     if (!int.TryParse(data.GameSaveData.First(a => a.Name == dataName).Value, out int result))
     {
         throw new Exception("Error - data with name: " + dataName + " Is not a number, so the -- operator cannot be applied to it");
     }
     else
     {
         var newVal = result + 1;
         SaveData(data, dataName, newVal.ToString());
     }
 }
 private void ResetGame()
 {
     gameState          = new PlayerGameSave();
     gameState.GameName = game.GameName;
     gameState.StateId  = startingState.Id;
     if (startData != null)
     {
         gameState.GameSaveData = startData.Select(a => new PlayerGameSaveData
         {
             Name  = a.Name,
             Value = a.Value
         }).ToList();
     }
     actionsDoneThisRun = 0;
     previousDataLength = 0;
 }
Example #15
0
        private void ParseAttachmentCommand(Player player, PlayerGameSave gameSave, string command)
        {
            command = CleanText(command);
            var commandSplit = command.Split(' ');

            if (command.StartsWith("imageBuild"))
            {
                ResolveImageBuildCommand(commandSplit);
            }
            else if (command.StartsWith("save"))
            {
                var dataName = commandSplit[1];
                _gameDataService.SaveData(gameSave, dataName);
            }
            else if (command.StartsWith("set"))
            {
                var dataName = commandSplit[1];
                if (commandSplit[2] == "=")
                {
                    var valueSet = ResolveValue(ConcatSplitAfterIndex(commandSplit, 3), gameSave);
                    _gameDataService.SaveData(gameSave, dataName, valueSet);
                }
                else if (commandSplit[2] == "--")
                {
                    _gameDataService.DecrementData(gameSave, dataName);
                }
                else if (commandSplit[2] == "++")
                {
                    _gameDataService.IncrementData(gameSave, dataName);
                }
                else
                {
                    throw new Exception("Error parsing: " + command + " as an attachment state command");
                }
            }
            else if (command.StartsWith("delete"))
            {
                var dataName = commandSplit[1];
                _gameDataService.DeleteData(gameSave, dataName);
            }
            else if (command.StartsWith("achievement"))
            {
                var dataValue = command.Substring(11, command.Length - 11).Trim();
                _gameDataService.SavePermanentData(player, gameSave.GameName, dataValue, PlayerSaveDataType.ACHIEVEMENT);
            }
        }
Example #16
0
 public void ParseAttachment(Player player, PlayerGameSave gameSave, StateAttachment stateAttachment)
 {
     try
     {
         var text = stateAttachment.StateText.Replace("<br>", "");
         text = text.Replace("<span>", "");
         var split = text.Split('#').ToList();
         split = split.Where(a => !string.IsNullOrWhiteSpace(a)).ToList();
         split.ForEach(a =>
         {
             ParseAttachmentCommand(player, gameSave, a);
         });
     } catch (Exception e)
     {
         HandleError(stateAttachment.StateText, e, gameSave);
     }
 }
Example #17
0
        public static string MakeMessage(Exception e, PlayerGameSave gameState, string additional = "")
        {
            var messages   = e.GetInnerExceptions().Select(a => a.Message);
            var stackTrace = e.StackTrace;

            string saveData = "NODATA";
            string gameName = "NOGAME";
            string player   = "NOPLAYER";

            gameName = gameState.GameName;
            if (gameState.GameSaveData != null)
            {
                saveData = string.Join(" ", gameState.GameSaveData.Select(a => $"[N: {a.Name} V: {a.Value}] "));
            }

            return($"ERROR: {additional} \n\nPlayer: {player}\nGame: {gameName} \nException messages: \n{messages} \n\nSave data: \n{saveData}\n\nStack trace\n{stackTrace}");
        }
        public DrawGame FindGame(Player player, PlayerGameSave gameSave)
        {
            var games      = _gameStore.ListGames();
            var gamesFound = games.Where(a => a.GameName == gameSave.GameName).ToList();

            if (gamesFound.Count == 0)
            {
                throw new AdventureGameException("Could not find the game being played for user: "******" and game name: " + gameSave.GameName + ". It may have been removed - sending back to main menu.", true);
            }
            if (gamesFound.Count > 1)
            {
                throw new AdventureGameException("Found more than one game applicable for player: " + player.Name + " and game name: " + gameSave.GameName + ". Something has therefore critically wrong.", true);
            }

            var gameBeingPlayed = gamesFound.First();

            return(gameBeingPlayed);
        }
Example #19
0
 public static PlayerGameSave Clone(this PlayerGameSave gameSave)
 {
     return(new PlayerGameSave
     {
         GameName = gameSave.GameName,
         SaveName = gameSave.SaveName,
         GameSaveData = gameSave.GameSaveData.Select(a => new PlayerGameSaveData
         {
             Name = a.Name,
             Value = a.Value
         }).ToList(),
         StateId = gameSave.StateId,
         FrameStack = gameSave.FrameStack.Select(a => new PlayerFrameStack
         {
             CreatedDate = a.CreatedDate,
             FunctionName = a.FunctionName,
             ReturnStateId = a.ReturnStateId,
         }).ToList()
     });
 }
Example #20
0
        private string ParseLine(PlayerGameSave gameSave, string line)
        {
            if (string.IsNullOrWhiteSpace(line))
            {
                return(null);
            }
            line = CleanText(line);
            var split            = line.Split(new string[] { "{{" }, StringSplitOptions.None);
            var lineConstruction = "";

            lineConstruction = split[0];
            for (int i = 1; i < split.Length; i++)
            {
                int    indexOfClose = split[i].IndexOf("}}");
                string parseString  = split[i].Substring(0, indexOfClose);
                string parsedWord   = ParseWord(gameSave, parseString);
                lineConstruction = lineConstruction + parsedWord + split[i].Substring(parseString.Length + 2, split[i].Length - parseString.Length - 2);
            }

            return(lineConstruction);
        }
Example #21
0
        private string ResolveValue(string valueString, PlayerGameSave gameSave)
        {
            var mainSplit = valueString.Split(' ');

            string currentVal = "";

            if (mainSplit[0].StartsWith("rand"))
            {
                var split      = valueString.Split(',');
                var fromString = split[0].Split('(')[1];
                var toString   = split[1].Split(')')[0];

                if (!int.TryParse(fromString, out int fromValue))
                {
                    throw new ArgumentException("Attempted to create rand from: " + valueString + " But the section: " + fromString + " was not a number");
                }
                if (!int.TryParse(toString, out int toValue))
                {
                    throw new ArgumentException("Attempted to create rand from: " + valueString + " But the section: " + fromString + " was not a number");
                }

                currentVal = "" + (new Random().Next(fromValue, toValue));
            }
            else if (_gameDataService.DataExists(gameSave, mainSplit[0]))
            {
                currentVal = _gameDataService.GetData(gameSave, mainSplit[0]);
            }
            else if (int.TryParse(mainSplit[0], out int valResult))
            {
                currentVal = "" + valResult;
            }
            else
            {
                currentVal = valueString;
            }

            if (mainSplit.Length > 1)
            {
                if (mainSplit[1] == "+")
                {
                    return("" + (int.Parse(currentVal) + int.Parse(ResolveValue(ConcatSplitAfterIndex(mainSplit, 2), gameSave))));
                }
                else if (mainSplit[1] == "-")
                {
                    return("" + (int.Parse(currentVal) - int.Parse(ResolveValue(ConcatSplitAfterIndex(mainSplit, 2), gameSave))));
                }
                else if (mainSplit[1] == "*")
                {
                    return("" + (int.Parse(currentVal) * int.Parse(ResolveValue(ConcatSplitAfterIndex(mainSplit, 2), gameSave))));
                }
                else if (mainSplit[1] == "//")
                {
                    return("" + (int.Parse(currentVal) / int.Parse(ResolveValue(ConcatSplitAfterIndex(mainSplit, 2), gameSave))));
                }
                else
                {
                    return(currentVal);
                }
            }
            else
            {
                return(currentVal);
            }
            throw new Exception("Shouldn't be possible");
        }
Example #22
0
        private (List <MessageResult> Messages, DrawState EndingState, List <string> StatesVisited) HandleFunctionReturn(string message, DrawState currentState, PlayerGameSave gameSave, Player player, DrawGame game, bool withDataChanges = true)
        {
            var topStackItem = gameSave.FrameStack.OrderByDescending(a => a.CreatedDate).FirstOrDefault();

            if (topStackItem == null)
            {
                throw new AdventureGameException($"No items on frame stack, but encountered a 'Return' statement", true);
            }
            var returnState = game.FindStateById(topStackItem.ReturnStateId);

            gameSave.FrameStack.Remove(topStackItem);

            gameSave.StateId = returnState.Id;
            return(RecursivelyHandleStates(returnState, gameSave, player, game, false, true));
        }
Example #23
0
 private void HandleError(string identifyingText, Exception e, PlayerGameSave gameSave = null)
 {
     Log.LogMessage(ErrorMessageHelper.MakeMessage(e, gameSave, "Parsing text: " + identifyingText), LogType.Error);
     throw e;
 }
Example #24
0
        public (List <MessageResult> Messages, DrawState EndingState, List <string> StatesVisited) RecursivelyHandleStates(DrawState currentState, PlayerGameSave gameSave, Player player, DrawGame game, bool withDataChanges = true, bool ignoreFrameShift = false)
        {
            if (withDataChanges)
            {
                HandleAnyAttachments(currentState, gameSave, player, false);
            }

            List <MessageResult> messages = new List <MessageResult>();
            var message = _textParsing.ParseText(gameSave, currentState.StateText);

            if (message != null && message.Trim().ToLower().StartsWith("#showbuiltimage"))
            {
                var imageUrl = _imageService.CreateImageAsync(_imageBuildDataTracker.GetParams()).Result;
                messages.Add(new MessageResult
                {
                    ImageUrl = imageUrl
                });
                message = "";
            }
            if (message != null && message.Trim().ToLower().StartsWith("#function"))
            {
                if (ignoreFrameShift)
                {
                    message = "";
                }
                else
                {
                    return(HandleFunction(message, currentState, gameSave, player, game, withDataChanges));
                }
            }
            if (message != null && message.Trim().ToLower().Equals("#return"))
            {
                return(HandleFunctionReturn(message, currentState, gameSave, player, game, withDataChanges));
            }

            if (!string.IsNullOrEmpty(message))
            {
                messages.Add(new MessageResult
                {
                    Message  = message,
                    ImageUrl = currentState.IsImage ? currentState.StateText : null,
                });
            }

            DrawState newState             = null;
            var       directTransitions    = currentState.StateOptions.Where(a => a.IsDirectTransition).ToList();
            var       nondirectTransitions = currentState.StateOptions.Where(a => !a.IsDirectTransition).ToList();
            var       resolvedTransitions  = nondirectTransitions.Select(a => (a.ResultState, _textParsing.ResolveOption(gameSave, a.StateText)));

            var validTransitions    = resolvedTransitions.Where(a => a.Item2.IsDirectTransition && a.Item2.DirectTransitionCommandResult && a.Item2.OptionType != OptionType.Fallback).ToList();
            var fallbackTransitions = resolvedTransitions.Where(a => a.Item2.IsDirectTransition && a.Item2.DirectTransitionCommandResult && a.Item2.OptionType == OptionType.Fallback).ToList();

            if (validTransitions.Count > 1)
            {
                throw new AdventureGameException("Found more than 1 applicable conditional direct transition");
            }
            else if (validTransitions.Count == 1)
            {
                newState = validTransitions.First().ResultState;
            }
            else if (directTransitions.Count > 1)
            {
                throw new AdventureGameException("Found more than 1 applicable direct transition");
            }
            else if (directTransitions.Count == 1)
            {
                newState = directTransitions.First().ResultState;
            }
            else if (fallbackTransitions.Count > 1)
            {
                throw new AdventureGameException("Found more than 1 applicable conditional direct transition");
            }
            else if (fallbackTransitions.Count == 1)
            {
                newState = fallbackTransitions.First().ResultState;
            }

            if (withDataChanges)
            {
                HandleAnyAttachments(currentState, gameSave, player, true);
            }

            if (newState == null)
            {
                return(messages, currentState, new List <string> {
                    currentState.Id
                });
Example #25
0
        private bool ResolveIf(PlayerGameSave gameSave, string command)
        {
            var split = command.Split(null);

            split = split.Where(a => !string.IsNullOrEmpty(a)).ToArray();
            bool andMore       = false;
            bool orMore        = false;
            int  indexMod      = 0;
            bool?initialResult = null;

            if (split.Length > 2 && (split[2] == "=" || split[2] == ">" || split[2] == "<"))
            {
                if (split.Length > 4)
                {
                    andMore = split[4] == "#and";
                    orMore  = split[4] == "#or";
                }

                var data1       = ResolveValue(split[1], gameSave);
                var conditional = split[2];
                var data2       = ConcactSplitAfterxUptoCharacter(split, 3, "#");

                var doesData2Exist = _gameDataService.GetData(gameSave, data2);
                if (doesData2Exist != null)
                {
                    data2 = doesData2Exist;
                }

                data2 = ResolveValue(data2, gameSave);

                if (split[0] == "#ifnot")
                {
                    initialResult = !ResolveOperation(data1, data2, conditional, gameSave);
                }
                if (split[0] == "#if")
                {
                    initialResult = ResolveOperation(data1, data2, conditional, gameSave);
                }
                indexMod = 5;
            }
            else
            {
                if (split.Length > 2)
                {
                    andMore = split[2] == "#and";
                    orMore  = split[2] == "#or";
                }
                bool exists = _gameDataService.DataExists(gameSave, split[1]);
                if (split[0] == "#ifnot")
                {
                    initialResult = !exists;
                }
                if (split[0] == "#if")
                {
                    initialResult = exists;
                }
                indexMod = 3;
            }

            if (andMore)
            {
                return(initialResult.Value && ResolveIf(gameSave, ConcatSplitAfterIndex(split, indexMod)));
            }
            else if (orMore)
            {
                return(initialResult.Value || ResolveIf(gameSave, ConcatSplitAfterIndex(split, indexMod)));
            }
            else
            {
                return(initialResult.Value);
            }
            throw new ApplicationException("Error parsing: " + command);
        }
 public void WarningMessage(string message, PlayerGameSave gameSave)
 {
     WarningMessages.Add(new UniqueTestDataItemWithSave {
         Value = message, GameSave = gameSave
     });
 }
 public void PotentialEndStateFound(string stateId, PlayerGameSave gameSave)
 {
     PotentialEndStates.Add(new UniqueTestDataItemWithSave {
         Value = stateId, GameSave = gameSave
     });
 }
 public void ErrorMessageEncountered(string errorMessage, PlayerGameSave gameSave)
 {
     ErrorMessages.Add(new UniqueTestDataItemWithSave {
         Value = errorMessage, GameSave = gameSave
     });
 }
 public void GrammarMistakeFound(string grammarMessage, PlayerGameSave gameSave)
 {
     GrammarMistakes.Add(new UniqueTestDataItemWithSave {
         Value = grammarMessage, GameSave = gameSave
     });
 }
 internal void CheckForNewVariables(PlayerGameSave gameState)
 {
     gameState.GameSaveData.ForEach(a => VariableNameEncountered(a.Name));
 }