Example #1
0
        /// <summary>
        /// Called when a game crashed. Displays a message and goes back home.
        /// </summary>
        /// <param name="crashMessageType"></param>
        /// <param name="exception"></param>
        /// <param name="cartridge"></param>
        public void HandleGameCrash(CrashMessageType crashMessageType, Exception exception, Cartridge cartridge)
        {
            // Prepares the message.
            StringBuilder sb = new StringBuilder();

            sb.Append("A problem occurred while ");
            switch (crashMessageType)
            {
            case CrashMessageType.NewGame:
                sb.Append("starting a new game");
                break;

            case CrashMessageType.Restore:
                sb.Append("restoring the saved game");
                break;

            case CrashMessageType.Runtime:
                sb.Append("running the game");
                break;

            default:
                sb.Append("running the game");
                break;
            }
            sb.Append(", therefore Geowigo cannot go on. This most likely happens because of a faulty cartridge");
            if (crashMessageType != CrashMessageType.NewGame)
            {
                sb.Append(" or savegame");
            }
            sb.Append(".\n\nIf the problem persists, you should contact Geowigo's developers (\"get support\" from the main menu) or the Cartridge owner, ");
            string cartFullAuthor = cartridge.GetFullAuthor();

            sb.Append(cartFullAuthor);
            AggregateException agex = exception as AggregateException;

            if (agex == null ||
                (agex != null && agex.InnerExceptions != null && agex.InnerExceptions.Count > 0))
            {
                sb.Append(", quoting the following error messages that were raised during the crash:");
                List <string> messages = new List <string>();
                if (agex == null)
                {
                    // In-depth dump of inner exception messages.
                    Exception curex = exception;
                    while (curex != null)
                    {
                        messages.Add(curex.Message);
                        curex = curex.InnerException;
                    }
                    messages.Reverse();
                }
                else
                {
                    foreach (Exception e in agex.InnerExceptions)
                    {
                        messages.Add(e.Message);
                    }
                }
                int i = messages.Count;
                foreach (string message in messages)
                {
                    sb.Append("\n" + i-- + "> " + message);
                }
            }
            else
            {
                sb.Append(".");
            }

            // Prepares the title.
            string caption = "";

            switch (crashMessageType)
            {
            case CrashMessageType.NewGame:
            case CrashMessageType.Restore:
                caption = "Cannot start game";
                break;

            case CrashMessageType.Runtime:
                caption = "Cartridge crashed";
                break;

            default:
                caption = "Game crash";
                break;
            }

            // Dump a log.
            DebugUtils.DumpException(exception, String.Format("Exception during play. Cartridge: {0} by {1}", cartridge.Name, cartFullAuthor), false);

            // Shows a message box.
            System.Windows.MessageBox.Show(
                sb.ToString(),
                caption,
                MessageBoxButton.OK
                );

            // Goes back!
            NavigationManager.NavigateToAppHome(true);
        }
		/// <summary>
		/// Called when a game crashed. Displays a message and goes back home.
		/// </summary>
		/// <param name="crashMessageType"></param>
		/// <param name="exception"></param>
		/// <param name="cartridge"></param>
		public void HandleGameCrash(CrashMessageType crashMessageType, Exception exception, Cartridge cartridge)
		{
			// Prepares the message.
			StringBuilder sb = new StringBuilder();
			sb.Append("A problem occurred while ");
			switch (crashMessageType)
			{
				case CrashMessageType.NewGame:
					sb.Append("starting a new game");
					break;

				case CrashMessageType.Restore:
					sb.Append("restoring the saved game");
					break;

				case CrashMessageType.Runtime:
					sb.Append("running the game");
					break;

				default:
					sb.Append("running the game");
					break;
			}
			sb.Append(", therefore Geowigo cannot go on. This most likely happens because of a faulty cartridge");
			if (crashMessageType != CrashMessageType.NewGame)
			{
				sb.Append(" or savegame");
			}
			sb.Append(".\n\nIf the problem persists, you should contact the Cartridge owner, ");
			sb.Append(cartridge.GetFullAuthor());
			AggregateException agex = exception as AggregateException;
			if (agex == null || 
				(agex != null && agex.InnerExceptions != null && agex.InnerExceptions.Count > 0))
			{
				sb.Append(", quoting the following error messages that were raised during the crash:");
				List<string> messages = new List<string>();
				if (agex == null)
				{
					// In-depth dump of inner exception messages.
					Exception curex = exception;
					while (curex != null)
					{
						messages.Add(curex.Message);
						curex = curex.InnerException;
					}
					messages.Reverse();
				}
				else
				{
					foreach (Exception e in agex.InnerExceptions)
					{
						messages.Add(e.Message);
					}
				}
				int i = messages.Count;
				foreach (string message in messages)
				{
					sb.Append("\n" + i-- + "> " + message);
				}
			}
			else
			{
				sb.Append(".");
			}

			// Prepares the title.
			string caption = "";
			switch (crashMessageType)
			{
				case CrashMessageType.NewGame:
				case CrashMessageType.Restore:
					caption = "Cannot start game";
					break;

				case CrashMessageType.Runtime:
					caption = "Cartridge crashed";
					break;

				default:
					caption = "Game crash";
					break;
			}

			// Shows a message box.
			System.Windows.MessageBox.Show(
				sb.ToString(),
				caption,
				MessageBoxButton.OK
			);

			// Goes back!
			App.Current.ViewModel.NavigationManager.NavigateToAppHome(true);
		}