/// <summary>
 /// Kills the game and removes it from currentRunning
 /// </summary>
 public void KillGame()
 {
     try
     {
         lock (RunningGame)
             RunningGame?.Kill();
         RunningGame = null;
     }
     catch
     { }
 }
 /// <summary>
 /// Instances A game  by index with a defualt of the first game avaible
 /// </summary>
 /// <param name="GameNumberToStart">The index of the game in the config</param>
 public void StartGame(object StartRequester, string GameGUIDToStart)
 {
     GameIsStartingEvent?.Invoke(this, new GameStartingEventArgs {
         GameName = Config[GameGUIDToStart].Name, RequestingObj = StartRequester
     });
     RunningGame = new InstanceGame(Config[GameGUIDToStart]);
     RunningGame.GameHasEndedEvent += GameEndedEventChain;
     RunningGame.StartGame();
     GameHasStartedEvent?.Invoke(this, new GameStartedEventArgs {
         GameName = Config[GameGUIDToStart].Name
     });
 }
        /// <summary>
        /// Instances A game by its name
        /// </summary>
        /// <param name="GameNumberToStart">The index of the game in the config</param>
        public void StartGameByName(object StartRequester, string GameNameToStart)
        {
            IGameModel gameConfig = Config.GetGameByName(GameNameToStart);

            GameIsStartingEvent?.Invoke(this, new GameStartingEventArgs {
                GameName = gameConfig.Name, RequestingObj = StartRequester
            });
            RunningGame = new InstanceGame(gameConfig);
            RunningGame.GameHasEndedEvent += GameEndedEventChain;
            RunningGame.StartGame();
            GameHasStartedEvent?.Invoke(this, new GameStartedEventArgs {
                GameName = gameConfig.Name
            });
        }
示例#4
0
        /// <summary>
        /// A fuction for threads that will monitor the process and kill all on end or issue
        /// </summary>
        /// <param name="GameInstanceIn">the game Intances for listing(this)</param>
        protected static void Monitor(object GameInstanceIn)
        {
            string Reason = "";
            //grab this GameInstance to watch
            InstanceGame GameInstance = (InstanceGame)GameInstanceIn;
            //set up a loop
            bool IsAlive = true;

            while (IsAlive)
            {
                //check for any reasons to end like primary exe has died
                lock (GameInstance.PrimaryGameExe)
                    if (IsAlive)
                    {
                        IsAlive = !GameInstance.PrimaryGameExe.HasExited;
                        Reason  = ProcessEndedKillReason;
                    }
                if (!IsAlive)
                {
                    break;
                }
                //check if any optional exe's have died
                lock (GameInstance.OptionalExes)
                    if (IsAlive)
                    {
                        IsAlive = !GameInstance.OptionalExes.All(x => x.OptionalExe.HasExited);
                        Reason  = ProcessEndedKillReason;
                    }
                if (!IsAlive)
                {
                    break;
                }
                //check if we still have play time
                lock (GameInstance)
                    if (IsAlive && 0 != GameInstance.PlayTimeAllowed && (ulong)GameInstance.Timer.ElapsedMilliseconds < GameInstance.PlayTimeAllowed)
                    {
                        IsAlive = false;
                        Reason  = PlayTimeAllowedEndedKillReason;
                    }
            }
            //Kill on end
            lock (GameInstance)
                GameInstance.Kill(Reason);
        }