コード例 #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 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);
		}