This commit is contained in:
ajtudela
2016-09-18 02:24:23 +02:00
29 changed files with 827 additions and 50 deletions

View File

@@ -11,14 +11,24 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{7C0598C9
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
ClickOnce-Debug|x86 = ClickOnce-Debug|x86
ClickOnce-Release|x86 = ClickOnce-Release|x86
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B4EFF030-C75A-49F9-A4BC-738D1B61C4AF}.ClickOnce-Debug|x86.ActiveCfg = ClickOnce-Debug|x86
{B4EFF030-C75A-49F9-A4BC-738D1B61C4AF}.ClickOnce-Debug|x86.Build.0 = ClickOnce-Debug|x86
{B4EFF030-C75A-49F9-A4BC-738D1B61C4AF}.ClickOnce-Release|x86.ActiveCfg = ClickOnce-Release|x86
{B4EFF030-C75A-49F9-A4BC-738D1B61C4AF}.ClickOnce-Release|x86.Build.0 = ClickOnce-Release|x86
{B4EFF030-C75A-49F9-A4BC-738D1B61C4AF}.Debug|x86.ActiveCfg = Debug|x86
{B4EFF030-C75A-49F9-A4BC-738D1B61C4AF}.Debug|x86.Build.0 = Debug|x86
{B4EFF030-C75A-49F9-A4BC-738D1B61C4AF}.Release|x86.ActiveCfg = Release|x86
{B4EFF030-C75A-49F9-A4BC-738D1B61C4AF}.Release|x86.Build.0 = Release|x86
{8E2499BC-C11A-4809-8737-66D35A625425}.ClickOnce-Debug|x86.ActiveCfg = Debug|x86
{8E2499BC-C11A-4809-8737-66D35A625425}.ClickOnce-Debug|x86.Build.0 = Debug|x86
{8E2499BC-C11A-4809-8737-66D35A625425}.ClickOnce-Release|x86.ActiveCfg = Release|x86
{8E2499BC-C11A-4809-8737-66D35A625425}.ClickOnce-Release|x86.Build.0 = Release|x86
{8E2499BC-C11A-4809-8737-66D35A625425}.Debug|x86.ActiveCfg = Debug|x86
{8E2499BC-C11A-4809-8737-66D35A625425}.Debug|x86.Build.0 = Debug|x86
{8E2499BC-C11A-4809-8737-66D35A625425}.Release|x86.ActiveCfg = Release|x86

View File

@@ -367,6 +367,10 @@ private LegalityCheck verifyRibbons()
if (!Encounter.Valid)
return new LegalityCheck(Severity.Valid, "Skipped Ribbon check due to other check being invalid.");
var TrainNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "SuperTrain").ToArray();
if (TrainNames.Count(MissionName => ReflectUtil.GetValue(pk6, MissionName) as bool? == true) == 30 ^ pk6.SecretSuperTrainingComplete)
return new LegalityCheck(Severity.Invalid, "Super Training complete flag mismatch.");
List<string> missingRibbons = new List<string>();
List<string> invalidRibbons = new List<string>();
@@ -385,9 +389,8 @@ private LegalityCheck verifyRibbons()
if (DistNames.Select(MissionName => ReflectUtil.GetValue(pk6, MissionName)).Any(Flag => Flag as bool? == true))
return new LegalityCheck(Severity.Invalid, "Distribution Super Training missions on Egg.");
var TrainNames = ReflectUtil.getPropertiesStartWithPrefix(pk6.GetType(), "SuperTrain");
if (TrainNames.Select(MissionName => ReflectUtil.GetValue(pk6, MissionName)).Any(Flag => Flag as bool? == true))
return new LegalityCheck(Severity.Fishy, "Super Training missions on Egg.");
return new LegalityCheck(Severity.Invalid, "Super Training missions on Egg.");
return new LegalityCheck();
}

View File

@@ -1,4 +1,5 @@
using System;
using PKHeX.Misc;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
@@ -142,7 +143,17 @@ public Main()
}
if (!SAV.Exportable) // No SAV loaded from exe args
{
string path = SaveUtil.detectSaveFile();
string path = null;
try
{
path = SaveUtil.detectSaveFile();
}
catch (Exception ex)
{
// Todo: translate this
ErrorWindow.ShowErrorDialog("An error occurred while attempting to auto-load your save file.", ex, true);
}
if (path != null && File.Exists(path))
openQuick(path, force: true);
else
@@ -204,7 +215,7 @@ public Main()
#region Path Variables
public static string WorkingDirectory => Environment.CurrentDirectory;
public static string WorkingDirectory => Util.IsClickonceDeployed ? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "PKHeX") : Environment.CurrentDirectory;
public static string DatabasePath => Path.Combine(WorkingDirectory, "db");
public static string WC6DatabasePath => Path.Combine(WorkingDirectory, "wc6");
private static string BackupPath => Path.Combine(WorkingDirectory, "bak");
@@ -576,10 +587,10 @@ private void openQuick(string path, bool force = false)
else
{
byte[] input; try { input = File.ReadAllBytes(path); }
catch (Exception e) { Util.Error("File is in use by another program!", path, e.ToString()); return; }
catch (Exception e) { Util.Error("Unable to load file. It could be in use by another program.\nPath: " + path, e); return; }
try { openFile(input, path, ext); }
catch (Exception e) { Util.Error("Unable to load file.", e.ToString()); }
catch (Exception e) { Util.Error("Unable to load file.\nPath: " + path, e); }
}
}
private void openFile(byte[] input, string path, string ext)
@@ -1106,6 +1117,10 @@ private void changeMainLanguage(object sender, EventArgs e)
FLP_PKMEditors.Location = new Point((Tab_OTMisc.Width - FLP_PKMEditors.Width)/2, FLP_PKMEditors.Location.Y);
populateFields(pk); // put data back in form
fieldsInitialized |= alreadyInit;
// Set the culture (makes it easy to pass language to other forms)
Thread.CurrentThread.CurrentCulture = new CultureInfo(lang_val[CB_MainLanguage.SelectedIndex]);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
private void InitializeStrings()
{
@@ -2779,7 +2794,7 @@ private void dragout_MouseDown(object sender, MouseEventArgs e)
DoDragDrop(new DataObject(DataFormats.FileDrop, new[] { newfile }), DragDropEffects.Move);
}
catch (Exception x)
{ Util.Error("Drag & Drop Error", x.ToString()); }
{ Util.Error("Drag & Drop Error", x); }
Cursor = DragInfo.Cursor = DefaultCursor;
File.Delete(newfile);
}
@@ -2835,7 +2850,7 @@ private void clickExportSAVBAK(object sender, EventArgs e)
try { Directory.CreateDirectory(BackupPath); Util.Alert("Backup folder created!",
$"If you wish to no longer automatically back up save files, delete the \"{BackupPath}\" folder."); }
catch { Util.Error($"Unable to create backup folder @ {BackupPath}"); }
catch(Exception ex) { Util.Error($"Unable to create backup folder @ {BackupPath}", ex); }
}
private void clickExportSAV(object sender, EventArgs e)
{
@@ -3767,7 +3782,7 @@ private void pbBoxSlot_MouseMove(object sender, MouseEventArgs e)
}
catch (Exception x)
{
Util.Error("Drag & Drop Error:", x.ToString());
Util.Error("Drag & Drop Error", x);
}
notifyBoxViewerRefresh();
DragInfo.Reset();

134
PKHeX/Misc/ErrorWindow.Designer.cs generated Normal file
View File

@@ -0,0 +1,134 @@
namespace PKHeX.Misc
{
partial class ErrorWindow
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ErrorWindow));
this.T_ExceptionDetails = new System.Windows.Forms.TextBox();
this.L_Message = new System.Windows.Forms.Label();
this.L_ProvideInfo = new System.Windows.Forms.Label();
this.B_CopyToClipboard = new System.Windows.Forms.Button();
this.B_Abort = new System.Windows.Forms.Button();
this.B_Continue = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// T_ExceptionDetails
//
this.T_ExceptionDetails.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.T_ExceptionDetails.Location = new System.Drawing.Point(12, 52);
this.T_ExceptionDetails.Multiline = true;
this.T_ExceptionDetails.Name = "T_ExceptionDetails";
this.T_ExceptionDetails.ReadOnly = true;
this.T_ExceptionDetails.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.T_ExceptionDetails.Size = new System.Drawing.Size(474, 143);
this.T_ExceptionDetails.TabIndex = 0;
//
// L_Message
//
this.L_Message.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.L_Message.Location = new System.Drawing.Point(9, 9);
this.L_Message.Name = "L_Message";
this.L_Message.Size = new System.Drawing.Size(477, 27);
this.L_Message.TabIndex = 1;
this.L_Message.Text = "An unknown error has occurred.";
//
// L_ProvideInfo
//
this.L_ProvideInfo.AutoSize = true;
this.L_ProvideInfo.Location = new System.Drawing.Point(9, 36);
this.L_ProvideInfo.Name = "L_ProvideInfo";
this.L_ProvideInfo.Size = new System.Drawing.Size(269, 13);
this.L_ProvideInfo.TabIndex = 2;
this.L_ProvideInfo.Text = "Please provide this information when reporting this error:";
//
// B_CopyToClipboard
//
this.B_CopyToClipboard.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.B_CopyToClipboard.Location = new System.Drawing.Point(12, 201);
this.B_CopyToClipboard.Name = "B_CopyToClipboard";
this.B_CopyToClipboard.Size = new System.Drawing.Size(164, 23);
this.B_CopyToClipboard.TabIndex = 3;
this.B_CopyToClipboard.Text = "Copy to Clipboard";
this.B_CopyToClipboard.UseVisualStyleBackColor = true;
this.B_CopyToClipboard.Click += new System.EventHandler(this.btnCopyToClipboard_Click);
//
// B_Abort
//
this.B_Abort.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.B_Abort.Location = new System.Drawing.Point(411, 201);
this.B_Abort.Name = "B_Abort";
this.B_Abort.Size = new System.Drawing.Size(75, 23);
this.B_Abort.TabIndex = 4;
this.B_Abort.Text = "Abort";
this.B_Abort.UseVisualStyleBackColor = true;
this.B_Abort.Click += new System.EventHandler(this.B_Abort_Click);
//
// B_Continue
//
this.B_Continue.Location = new System.Drawing.Point(330, 201);
this.B_Continue.Name = "B_Continue";
this.B_Continue.Size = new System.Drawing.Size(75, 23);
this.B_Continue.TabIndex = 5;
this.B_Continue.Text = "Continue";
this.B_Continue.UseVisualStyleBackColor = true;
this.B_Continue.Click += new System.EventHandler(this.B_Continue_Click);
//
// ErrorWindow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(498, 236);
this.Controls.Add(this.B_Continue);
this.Controls.Add(this.B_Abort);
this.Controls.Add(this.B_CopyToClipboard);
this.Controls.Add(this.L_ProvideInfo);
this.Controls.Add(this.L_Message);
this.Controls.Add(this.T_ExceptionDetails);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "ErrorWindow";
this.Text = "Error";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox T_ExceptionDetails;
private System.Windows.Forms.Label L_Message;
private System.Windows.Forms.Label L_ProvideInfo;
private System.Windows.Forms.Button B_CopyToClipboard;
private System.Windows.Forms.Button B_Abort;
private System.Windows.Forms.Button B_Continue;
}
}

138
PKHeX/Misc/ErrorWindow.cs Normal file
View File

@@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace PKHeX.Misc
{
public partial class ErrorWindow : Form
{
public static DialogResult ShowErrorDialog(string friendlyMessage, Exception ex, bool allowContinue)
{
var lang = System.Threading.Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName;
var dialog = new ErrorWindow(lang);
dialog.ShowContinue = allowContinue;
dialog.Message = friendlyMessage;
dialog.Error = ex;
var dialogResult = dialog.ShowDialog();
if (dialogResult == DialogResult.Abort)
{
Application.Exit();
}
return dialogResult;
}
public ErrorWindow()
{
InitializeComponent();
}
public ErrorWindow(string lang) : this()
{
Util.TranslateInterface(this, lang);
}
/// <summary>
/// Gets or sets whether or not the "Continue" button is visible.
/// </summary>
/// <remarks>For UI exceptions, continuing could be safe.
/// For application exceptions, continuing is not possible, so the button should not be shown.</remarks>
public bool ShowContinue
{
get
{
return B_Continue.Visible;
}
set
{
B_Continue.Visible = value;
}
}
/// <summary>
/// Friendly, context-specific method shown to the user.
/// </summary>
/// <remarks>This property is intended to be a user-friendly context-specific message about what went wrong.
/// For example: "An error occurred while attempting to automatically load the save file."</remarks>
public string Message
{
get
{
return L_Message.Text;
}
set
{
L_Message.Text = value;
}
}
public Exception Error
{
get
{
return _error;
}
set
{
_error = value;
UpdateExceptionDetailsMessage();
}
}
private Exception _error;
private void UpdateExceptionDetailsMessage()
{
var details = new StringBuilder();
details.AppendLine("Exception Details:");
details.AppendLine(Error.ToString());
details.AppendLine();
details.AppendLine("Loaded Assemblies:");
details.AppendLine("--------------------");
try
{
foreach (var item in AppDomain.CurrentDomain.GetAssemblies())
{
details.AppendLine(item.FullName);
details.AppendLine(item.Location);
details.AppendLine();
}
}
catch (Exception ex)
{
details.AppendLine("An error occurred while listing the Loaded Assemblies:");
details.AppendLine(ex.ToString());
}
details.AppendLine("--------------------");
// Include message in case it contains important information, like a file path.
details.AppendLine("User Message:");
details.AppendLine(Message);
T_ExceptionDetails.Text = details.ToString();
}
private void btnCopyToClipboard_Click(object sender, EventArgs e)
{
Clipboard.SetText(T_ExceptionDetails.Text);
}
private void B_Continue_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
Close();
}
private void B_Abort_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Abort;
Close();
}
}
}

216
PKHeX/Misc/ErrorWindow.resx Normal file
View File

@@ -0,0 +1,216 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAE
AAAAAAAAAAAAAAAAAAAAAAAAIyMjAQAAAAALCwsPJiYmJysrKycqKionKSkpJykpKScpKSknKioqJyoq
KicrKysnJycnJw0ODQ8AAAAAJiYmAQAAAABpaWlHq6ur17+/v+6+vr7svr6+7b6+vu2+vr7tvr6+7b6+
vu2+vr7tvr6+7L+/v+6rq6vXampqSAAAAAAoKSgXvr++3eLi4v/g4OD94eHh/+Hh4f/i4uL/4uLi/+Li
4v/i4uL/4eHh/+Dh4P/g4OD94uLi/7+/v90sLCwXfn5+PNna2frg4OD/39/f/uHh4f7h4eH+39/f/uDg
4P7g4OD+39/f/uHh4f7h4OH+39/f/t/g3//a2tr6g4ODPoOCgz7X19f64+Pj/+Li4v7k5OT/4+Tj//Ly
8v/19fX/9PT0//T09P/k5OT/5OTk/+Pj4/7j4+P/19jX+4qLikCDhIM+2tra++Xl5f/k5eT+5OTk//Lz
8v+urq7/RUVF/z4+Pv+Zmpn/8fHx/+Xm5f/k5eT+5eXl/9ra2vyLi4tAhYWFPuXm5vvx8vP/7+/w/v//
//+sra3/AgIC/15eXv9tbG3/BQUF/4yMjP//////7+/w/vHy8//l5ub8jY2NQC4uLD5LS0f7UFBL/09P
Sv5YWVP/FBUS/29wcP///////////5SUlP8PDw//U1NO/1BQS/5PT0r/S0tH/DIyMEAAAAs+AAAM+wAA
Dv8AAA/+AwMS/wAAAP+UlJX///////////+3t7n/AAAA/wAAD/8BAQ/+AAAO/wAADPwCAg5ABARSPgoK
k/sNDab/DQ2o/hAQvP8CAmj/IiIW/7Kzrv/Cw8D/NDQm/wAATf8QELz/DQ2q/gwMp/8LC5T8Dg5bQAUF
Xj4KCpz7DQ2u/w0NsP4NDbX/Dw+//wUFYf8CAhL/AwMP/wMDTf8ODrj/Dg64/w0NsP4MDK7/Cwud/A8P
aEEGBmU9DAyl+w4Otf8ODrf+Dw+6/xAQvv8TE8v/EhK+/xAQvP8TE8v/EBDA/w8Puf8PD7f+Dg61/w0N
pvsREW9ACAhtQA8PsfsTE77/ExO//xQUwP8UFML/FBTD/xUVyP8WFsn/FRXE/xQUw/8UFMH/ExO//xMT
vv8QELL7ERF3QxkZdCgXF771ExPH/xUVyPwVFcn9FhbL/RcXzP0XF8z9FxfM/RcXy/0XF8v9FhbJ/RUV
yPwTE8f/Fxe+9RkZdykAAAAAIyOtghsbx/8ZGcj+GRnJ/xoayf8aGsn/GhrK/xoayv8aGsn/GhrJ/xkZ
yf8ZGcj+GxvH/yMjrYQAAAAAAADHAQAAAAAzM51FLCyscCoqrGwqKqxtKSmsbSoqrG0qKqxtKSmsbSoq
rG0qKqxsLCyscDMznUUAAAAAAAAAAP//AADAAwAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
AACAAQAAgAEAAIABAACAAQAAgAEAAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKysrCR0dHSMWFhY3GBgYORgYGDkYGBg5GBgYORgY
GDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5FxcXNx4e
HiQuLi4JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhIARYWFis7OzuVkJCQ2ampqeqqqqrsqqqq7Kqq
quyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqq
quypqanqkZGR2j09PZcXFxcsUFBQAQAAAAAAAAAAAAAAAAAAAAASEhIuhISEytvb2/7W1tb/19fX/9jY
2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/2NjY/9jY
2P/Y2Nj/2NjY/9fX1//W1tb/29vb/oeHh8sTExMvAAAAAAAAAAAAAAAAPDw8DGtra6zZ2dn/2dnZ/9ra
2v/b29v/29vb/9vb2//c3Nz/3Nzc/9zc3P/c3Nz/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3Nzc/9zc
3P/c3Nz/3Nzc/9vb2//b29v/29vb/9ra2v/Z2dn/2dnZ/21tba5DQ0MNAAAAAAAAAAAiIiIx1NXU9tna
2f/c3Nz/3d3d/93e3f/e3t7/3t7e/9/f3//f39//39/f/9/g3//g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg
4P/g4OD/39/f/9/f3//f39//3t/e/97e3v/d3t3/3d3d/9zc3P/Z2tn/1dXV9icnJzMAAAAAAAAAAFhZ
WFzf4N//3Nzc/97e3v/f39//39/f/9/g3//g4OD/4ODg/+Hh4f/h4eH/4eHh/+Li4v/i4uL/4uLi/+Li
4v/i4uL/4uLi/+Hi4f/h4eH/4eHh/+Dg4P/g4OD/3+Df/9/f3//f39//3t7e/9zc3P/f39//XV1dXQAA
AAAAAAAAZmZmZdvc2//e3t7/3+Df/+Dg4P/g4eD/4eHh/+Hi4f/i4uL/4uPi/+Pj4//j4+P/5OTk/+Tk
5P/k5OT/5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/f4N//3t7e/9vb
2/9wcHBoAAAAAAAAAABoaGhl3d3d/9/f3//h4eH/4eLh/+Li4v/j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl
5f/l5uX/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh
4f/f39//3N3c/3Nzc2kAAAAAAAAAAGhoaGXe3t7/4ODg/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5eXl/+bm
5v/m5+b/5+fn/+fn5//n6Of/6Ojo/+jo6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pk
4//j4+P/4uLi/+Dg4P/e3t7/c3NzaQAAAAAAAAAAaGhoZd/g3//i4uL/5OTk/+Tl5P/l5eX/5ebl/+bn
5v/n5+f/5+jn/+jp6P/p6en/7Ozs/8LCwv+Tk5P/ioqK/66urv/o6ej/6enp/+jp6P/o6Oj/5+jn/+bn
5v/m5ub/5ebl/+Tl5P/k5OT/4uLi/9/g3/9zdHNpAAAAAAAAAABoaWhl4eLh/+Pk4//m5ub/5ubm/+fn
5//n6Of/6Ojo/+np6f/p6un/6urq/8bGxv8yMjL/AAAA/wAAAP8AAAD/AAAA/xMTE/+ZmZn/7Ozs/+rq
6v/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/k5OT/4eHh/3R0dGkAAAAAAAAAAGhpaGXj4+P/5eXl/+fn
5//n6Of/6Ojo/+np6f/q6ur/6urq/+vr6//Dw8P/DAwM/wAAAP8AAAD/Gxsb/ygoKP8BAQH/AAAA/wAA
AP+FhYX/7O3s/+rr6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+Xl5f/i4+L/dHR0aQAAAAAAAAAAYWFhZeTl
5P/m5+b/6Ono/+np6f/p6un/6uvq/+vr6//s7Oz/7e7t/ycnJ/8AAAD/Ghoa/7S0tP/m5ub/5OTk/9HR
0f9GRkb/AAAA/wICAv/IyMj/7Ozs/+vs6//q6+r/6urq/+nq6f/o6ej/5+fn/+Tk5P9sbGxpAAAAAAAA
AAA9Pj1lj4+P/5OTk/+VlZX/lpaW/5eXl/+YmJj/mZmZ/5qamv92dnb/AAAA/wEBAf+/wL//3Nzc/+Tk
5P/l5eX/3d3d/+Li4v8mJib/AAAA/0ZGRv+ampr/mZmZ/5iYmP+Xl5f/lpaW/5WVlf+Tk5P/j4+P/0ZG
RmoAAAAAAAAAAAwMDGUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Nzc3/+fn
5//q6ur/7O3s/+zt7P/v7+//39/f/4WFhf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/EBAQagAAAAAAAAAAAwMHZQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP9NTU3/5ufm//Lz8v/z9PP/8/Tz//X19f/l5eX/nZ2d/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8GBgpqAAAAAAAAAAAAABZlAQEk/wEBJ/8CAin/AgIq/wICKv8CAiv/AgIs/wIC
LP8BAR3/AAAA/xwcHP/w8PD/6+zr//r6+v/6+vr/9PT0/+vr6/9lZWX/AAAA/wAAD/8CAi3/AgIs/wIC
K/8CAir/AgIq/wICKf8BASf/AQEl/wUFG2oAAAAAAAAAAAICQGUGBpL/Bwec/wgIo/8JCaf/CQmq/wkJ
rf8JCa//Cgqz/wkJqP8AAAL/AAAA/4CAgP/y8/L/6+zr/+3t7f/u7u7/xMTE/wcHB/8AAAD/BgZz/woK
s/8JCbD/CQmt/wkJqv8JCaj/CAik/wcHnf8HB5P/Dg5MagAAAAAAAAAAAwNHZQgIk/8JCZ3/Cgqj/wsL
p/8LC6n/Cwus/wsLr/8MDLL/DAy2/wYGW/8AAAD/AAAA/1JSUv+sraz/tra2/3h4eP8KCgr/AAAA/wIC
Iv8MDLb/DAyy/wsLsP8LC63/Cwuq/wsLp/8KCqT/CQmd/wgIk/8PD1VrAAAAAAAAAAAEBE1lCQmY/woK
ov8LC6j/DAyr/wwMrf8MDLD/DAyy/w0Ntf8NDbf/Dg67/wUFSv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8CAiH/DQ2q/w0NuP8NDbX/DQ2z/wwMsP8MDK7/DAyr/wsLqP8KCqL/CQmZ/xAQWmsAAAAAAAAAAAQE
UGUKCp7/Cwum/wwMrP8NDa//DQ2w/w0Ns/8ODrX/Dg63/w4Ouf8ODrv/Dw/A/wwMiv8FBTj/AAAG/wAA
AP8DAyb/CQls/w8Pu/8PD7z/Dg66/w4OuP8ODrX/DQ2z/w0Nsf8NDa//DAys/wsLp/8KCp7/ERFeawAA
AAAAAAAABQVTZQsLpP8MDKv/DQ2w/w4Os/8ODrT/Dg62/w8PuP8PD7r/Dw+8/w8Pvf8QEL//EBDA/xER
w/8SEsn/ERHJ/xERxf8QEMD/EBC//w8Pvv8PD7z/Dw+6/w8PuP8ODrf/Dg61/w4Os/8NDbH/DAyr/wsL
pP8SEmFrAAAAAAAAAAAGBlZlDAyq/w4OsP8PD7X/Dw+3/w8PuP8QELr/EBC7/xAQvf8REb7/ERHA/xER
wf8REcL/EhLC/xISw/8SEsP/EhLC/xERwv8REcH/ERHA/xERvv8QEL3/EBC7/xAQuv8QELj/Dw+3/w8P
tf8ODrD/DAyq/xMTZWsAAAAAAAAAAAcHWmUODrD/EBC2/xERuv8REbz/ERG9/xISvv8SEr//EhLA/xMT
wf8TE8P/ExPD/xMTxP8TE8X/FBTF/xQUxf8UFMX/ExPE/xMTxP8TE8P/ExPC/xISwf8SEr//EhK+/xER
vf8REbz/ERG6/xAQtv8ODrD/FBRpawAAAAAAAAAACAhcYxAQtf8SErv/ExO+/xQUwP8UFMD/FBTB/xUV
wv8VFcP/FRXE/xUVxf8WFsb/FhbG/xYWx/8WFsf/FhbH/xYWx/8WFsf/FhbG/xYWxf8VFcT/FRXD/xUV
wv8UFMH/FBTB/xQUwP8TE77/EhK7/xAQtf8TE2hoAAAAAAAAAAAQEFNUFRXC/xMTv/8UFMP/FRXE/xUV
xP8VFcX/FRXG/xYWx/8WFsf/FhbI/xYWyf8XF8n/FxfK/xcXyv8XF8r/FxfK/xcXyf8XF8n/FhbI/xYW
yP8WFsf/FhbG/xUVxf8VFcT/FRXE/xQUw/8TE7//FRXB/xAQV1UAAAAAAAAAAA0NPxkjI8byFBTD/xUV
x/8WFsj/FxfJ/xcXyf8XF8r/FxfK/xcXy/8YGMz/GBjM/xgYzP8YGM3/GBjN/xgYzf8YGM3/GBjM/xgY
zP8YGMz/GBjL/xcXy/8XF8r/FxfJ/xcXyf8WFsj/FRXH/xQUw/8jI8f0Dg5GGwAAAAAAAAAAFhZxAiUl
eIUZGcr/FBTI/xUVyv8WFsv/FhbM/xYWzP8WFsz/FhbN/xcXzf8XF83/FxfN/xcXzv8XF87/FxfO/xcX
zv8XF87/FxfN/xcXzf8WFs3/FhbM/xYWzP8WFsz/FhbL/xUVyv8UFMj/GBjJ/yYmeogWFnYCAAAAAAAA
AAAAAAAAGBh1BzMzk50kJNP+FxfK/xgYzP8YGMz/GBjN/xgYzf8YGM3/GBjN/xgYzf8ZGc7/GRnO/xkZ
zv8ZGc7/GRnO/xkZzv8YGM3/GBjN/xgYzf8YGM3/GBjN/xgYzP8YGMz/FxfK/yMj0v4zM5WfFBRkBwAA
AAAAAAAAAAAAAAAAAAAAAAAAHBx7Ay0tdkg3N5emMTGpxSwsp8gsLKfILCynyCwsp8gsLKfILCynyCws
p8gsLKfILCynyCwsp8gsLKfILCynyCwsp8gsLKfILCynyCwsp8gsLKfILCynyDExqcU2NpenLi54Shsb
ewMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////8AAAD+AAAAfAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPAAAADwAAAA8AAAAPAAAAD4AAAB/gAAB//////
</value>
</data>
</root>

View File

@@ -58,12 +58,42 @@
<PropertyGroup>
<StartupObject>PKHeX.Program</StartupObject>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ClickOnce-Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\ClickOnce-Debug\</OutputPath>
<DefineConstants>DEBUG;CLICKONCE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<LangVersion>6</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ClickOnce-Release|x86'">
<DefineConstants>CLICKONCE</DefineConstants>
<OutputPath>bin\x86\ClickOnce-Release\</OutputPath>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<LangVersion>6</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.Web" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup Condition="'$(Configuration)|$(Platform)' == 'ClickOnce-Debug|x86'">
<Reference Include="System.Deployment" />
</ItemGroup>
<ItemGroup Condition="'$(Configuration)|$(Platform)' == 'ClickOnce-Release|x86'">
<Reference Include="System.Deployment" />
</ItemGroup>
<ItemGroup>
<Compile Include="Legality\Analysis.cs" />
@@ -93,6 +123,12 @@
<Compile Include="MainWindow\MainPK3.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Misc\ErrorWindow.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Misc\ErrorWindow.Designer.cs">
<DependentUpon>ErrorWindow.cs</DependentUpon>
</Compile>
<Compile Include="MysteryGifts\MysteryGift.cs" />
<Compile Include="MysteryGifts\PL6.cs" />
<Compile Include="PersonalInfo\PersonalInfo.cs" />
@@ -329,6 +365,7 @@
<Compile Include="Util\ByteUtil.cs" />
<Compile Include="Util\DataUtil.cs" />
<Compile Include="Util\DateUtil.cs" />
<Compile Include="Util\DeployUtil.cs" />
<Compile Include="Util\FormUtil.cs" />
<Compile Include="Util\ImageUtil.cs" />
<Compile Include="Util\NetUtil.cs" />
@@ -336,6 +373,9 @@
<Compile Include="Util\RandUtil.cs" />
<Compile Include="Util\ReflectUtil.cs" />
<Compile Include="Util\StringUtil.cs" />
<EmbeddedResource Include="Misc\ErrorWindow.resx">
<DependentUpon>ErrorWindow.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Misc\QR.resx">
<DependentUpon>QR.cs</DependentUpon>
<SubType>Designer</SubType>

View File

@@ -574,7 +574,7 @@ private static void setPKXFont()
AddFontMemResourceEx(fontPtr, (uint)Resources.pgldings_normalregular.Length, IntPtr.Zero, ref dummy);
Marshal.FreeCoTaskMem(fontPtr);
}
catch { Util.Error("Unable to add ingame font."); }
catch (Exception ex) { Util.Error("Unable to add ingame font.", ex); }
}
// Personal.dat

View File

@@ -1,4 +1,7 @@
using System;
using PKHeX.Misc;
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
namespace PKHeX
@@ -11,9 +14,72 @@ internal static class Program
[STAThread]
private static void Main()
{
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new ThreadExceptionEventHandler(UIThreadException);
// Set the unhandled exception mode to force all Windows Forms errors to go through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Add the event handler for handling non-UI thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
// Run the application
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Main());
}
// Handle the UI exceptions by showing a dialog box, and asking the user whether or not they wish to abort execution.
private static void UIThreadException(object sender, ThreadExceptionEventArgs t)
{
DialogResult result = DialogResult.Cancel;
try
{
// Todo: make this translatable
ErrorWindow.ShowErrorDialog("An unhandled exception has occurred.\nYou can continue running PKHeX, but please report this error.", t.Exception, true);
}
catch
{
try
{
// Todo: make this translatable
MessageBox.Show("A fatal error has occurred in PKHeX, and the details could not be displayed. Please report this to the author.", "PKHeX Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
// Exits the program when the user clicks Abort.
if (result == DialogResult.Abort)
Application.Exit();
}
// Handle the UI exceptions by showing a dialog box, and asking the user whether
// or not they wish to abort execution.
// NOTE: This exception cannot be kept from terminating the application - it can only
// log the event, and inform the user about it.
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
var ex = (Exception)e.ExceptionObject;
// Todo: make this translatable
ErrorWindow.ShowErrorDialog("An unhandled exception has occurred.\nPKHeX must now close.", ex, false);
}
catch
{
try
{
// Todo: make this translatable
MessageBox.Show("A fatal non-UI error has occurred in PKHeX, and the details could not be displayed. Please report this to the author.", "PKHeX Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
}
}
}

Binary file not shown.

Binary file not shown.

View File

@@ -776,7 +776,7 @@ http://projectpokemon.org/forums/showthread.php?36986
- Added: Cleaner 'delete' command to batch editor (set species to 0 to clear data).
- Added: Specifying output folder when modifying a folder in the Batch Editor. Thanks \!
08/22/16 - New Update:
08/22/16 - New Update: (53700)
- Changed: Drag&Drop now replaces the cursor with the sprite to better simulate moving a Pokémon.
- Added: FBI homebrew save file detection. Thanks poutros!
- Fixed: Program now indicates the type of blank save file loaded if none is detected on startup.
@@ -788,4 +788,38 @@ http://projectpokemon.org/forums/showthread.php?36986
- Fixed: Legality indication persists when loading a save file.
- Fixed: Hyperspace Fury legality. Thanks RanEncounter!
- Changed: Batch Editor improvements for PID/EC writing. Thanks JSS & Pokegeo!
- Changed: Updated Spanish and Chinese translation. Thanks ajtudela & easyworld!
- Changed: Updated Spanish and Chinese translation. Thanks ajtudela & easyworld!
09/18/16 - New Update:
- Added: Gen 1 & 2 support. Thanks SciresM, and all those who tested!
- Added: Gen 1<->2 conversion. Thanks SciresM!
- Added: Super Secret Training Completed flag. Thanks SciresM!
- Added: Program will now check for updates when the program starts. If an update is available, a URL label will appear.
- Added: Mystery Gift event database browser. Currently only views wc6, can be loaded to tabs! Hotkey is CTRL-G.
- Added: Gen 4 & 5 Pokedex form flags will be set when the Pokémon is set to the save file.
- Added: Hall of Fame time in Trainer editor. Thanks ricksee!
- Added: Gen 1/2/3 Met Location and Item strings for Spanish and Chinese games. Thanks ajtudela & easyworld!
- Added: Spiky Eared Pichu sprite.
- Added: MetDate/EggMetDate property setting in the Batch Editor (refer to FAQ, yyyyMMdd format). Thanks AvantGourd!
- Added: Box Viewer popup for easier box management. Doubleclick the "Box" tab. To open more than one, hold Shift while double clicking.
- Fixed: Non-box drag&drop slots will set the cursor to the slot's sprite while dragging, just like Box Slots.
- Fixed: O-Power editing saving will now save back to the save file.
- Fixed: Improved save detection for gen4/5 games, including saves that were just (re)started.
- Fixed: Gen4 ribbon editor give-all no longer throws an exception.
- Fixed: Changed event constants from signed to unsigned. Thanks evandixon!
- Fixed: Changing Unown's form as a pk3 will now update the PID. Thanks NinFanBoyFTW!
- Fixed: EncounterType dropdown now appears at the correct time. Thanks JSS!
- Fixed: HM07/HM08 inventory editing for gen4/5. Thanks msbhvn & Liger0!
- Fixed: Setting gen4 HGSS balls corrected. Thanks theSLAYER!
- Fixed: Gen3 inventory editor give-all disabled, as Bag is too small to give all items for a given pouch. Thanks Liger0!
- Fixed: Gen1/2/3 sub-editors erasing changes made to box Pokémon. Thanks SciresM, MichiS97!
- Fixed: Tangled Feet Rayquaza in Gen3. Thanks Delta Blast Burn!
- Legality: Level 20 Gallade is now recognized as legal. Thanks Rohul1997!
- Legality: Gen4 starters disallowed from having Gen3/4 balls. Thanks /u/Subject21_J
- Legality: Added Super Training legality checks. Thanks sora10pls!
- Changed: Inventory Editing now uses prettier sprites for each tab.
- Changed: Showdown Set parsing updated to account for user error when manually typing a set instead of exporting from Showdown as intended.
- Changed: Backed up save file names are now easier on the eye. Gen 1-5 saves will use played time, Gen 6 use the last saved datetime.
- Changed: First 3 tabs of PKM editor (left side) redesigned to fit and collapse controls for all the different games that are supported.
- Changed: Tabs with no controls visible will be hidden. Example: Hiding Box Tab with ORAS Demo save loaded.
- Changed: Met locations are now top-sorted with the locations available to the Origin Game.

View File

@@ -345,4 +345,14 @@ Tab_Residence = Herkunft
- **Please leave the {0} in your line. The OT name will show instead.
--
L_Arguments = Deaktiviert ; Nie verlassen ; OT ; Letzte Gen. ; Erinnerungen mit ; Pokémon ; Area ; Item(s) ; Move ; Location
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! ErrorWindow = Error
- Change stuff below this line, not above.
-------------------------------------------------------
L_ProvideInfo = Please provide this information when reporting this error:
B_CopyToClipboard = Copy to Clipboard
B_Continue = Continue
B_Abort = Abort
! End

View File

@@ -873,4 +873,14 @@ B_Import = Import
B_Output = Export
B_Cancel = Cancel
B_Save = Save
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! ErrorWindow = Error
- Change stuff below this line, not above.
-------------------------------------------------------
L_ProvideInfo = Please provide this information when reporting this error:
B_CopyToClipboard = Copy to Clipboard
B_Continue = Continue
B_Abort = Abort
! End

View File

@@ -947,3 +947,13 @@ B_ExportCGB = Exportar .cgb
B_Cancel = Cancelar
B_Save = Guardar
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! ErrorWindow = Error
- Change stuff below this line, not above.
-------------------------------------------------------
L_ProvideInfo = Por favor, proporciona esta información cuando reportes este fallo:
B_CopyToClipboard = Copiar al portapapeles
B_Continue = Continuar
B_Abort = Abortar
! End

View File

@@ -362,4 +362,14 @@ L_Country = Pays
- **Please leave the {0} in your line. The OT name will show instead.
--
L_Arguments = Onglet désactivé ; Toujours avec ; DO ; Génération précédente - ; Souvenirs avec ; Pokémon ; Zone ; Objet(s) ; Attaque ; Emplacement
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! ErrorWindow = Erreur
- Change stuff below this line, not above.
-------------------------------------------------------
L_ProvideInfo = Veuillez fournir les informations suivantes dans votre rapport d'erreur :
B_CopyToClipboard = Copier dans le presse-papier
B_Continue = Continuer
B_Abort = Abandonner
! End

View File

@@ -798,4 +798,14 @@ B_Import = Import
B_Output = Export
B_Cancel = Cancel
B_Save = Save
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! ErrorWindow = Error
- Change stuff below this line, not above.
-------------------------------------------------------
L_ProvideInfo = Please provide this information when reporting this error:
B_CopyToClipboard = Copy to Clipboard
B_Continue = Continue
B_Abort = Abort
! End

View File

@@ -360,4 +360,14 @@ L_Region = 地域
L_Country = 国
--
L_Arguments = 使用禁止 ; 左はありませんでした ; OT ; 前回のゲーム ; との思い出 ; ポケモン ; エリア ; 項目 ; わざ ; 場所 ;
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! ErrorWindow = Error
- Change stuff below this line, not above.
-------------------------------------------------------
L_ProvideInfo = Please provide this information when reporting this error:
B_CopyToClipboard = Copy to Clipboard
B_Continue = Continue
B_Abort = Abort
! End

View File

@@ -798,4 +798,14 @@ B_Import = 넣기
B_Output = 빼내기
B_Cancel = 취소
B_Save = 저장
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! ErrorWindow = Error
- Change stuff below this line, not above.
-------------------------------------------------------
L_ProvideInfo = Please provide this information when reporting this error:
B_CopyToClipboard = Copy to Clipboard
B_Continue = Continue
B_Abort = Abort
! End

View File

@@ -1,6 +1,5 @@
If you are having issues viewing certain symbols/text: Options -> Toggle Font.
// Main Window
CTRL-O: Open
@@ -10,6 +9,7 @@ CTRL-B: Export BAK
CTRL-Q: Quit
CTRL-D: Open Database
CTRL-G: Open Mystery Gift Database
CTRL-R: Open Box Report
CTRL-P: Open About PKHeX
CTRL-T: Import Showdown Set
@@ -41,17 +41,16 @@ Click on the OT label to set relevant details to that of the save file.
Drop WC6/PGF/PCD/PGT to convert to PK6 in the main tabs.
- Hold CTRL to open the Wonder Card interface when opening a WC6.
// Party / Battle Box
- Double click to export team to Showdown set format.
// Save File
Click on the Save File path (above Boxes): Auto-detect/Reload save.
- Shift skips SaveDataFiler
Doubleclick on the SAV Tab: Auto-detect/Reload latest save.
// Boxes
Control-Click Box Tab: Sort Boxes.
Control-Click Box Tab: Sort Current Box contents.
Control-Shift-Click Box Tab: Sort All Boxes.
Alt-Click Box Tab: Delete Current Box contents.
Alt-Shift-Click Box Tab: Delete All Boxes.
Control-Drag a Box Slot to Copy-Overwrite
Alt-Drag a Box Slot to Delete-Overwrite
@@ -61,17 +60,20 @@ Control-Click a slot to load slot to tabs.
Shift-Click a slot to set tabs to slot.
Alt-Click a slot to delete the data in slot.
Doubleclick on the Party or Battle Box label to export Showdown/Smogon Set (Team) to Clipboard.
Doubleclick the Box tab to open up a new Box Viewer. Only one is allowed at a time, unless you hold shift when doubleclicking.
- Note: Having multiple instances of the same box open and making changes to that box will not re-sync the box sprites until the box is reloaded.
// Party / Battle Box
Doubleclick on the Party or Battle Box label to export Showdown/Smogon Set (Team) to Clipboard.
// Misc Editors
INVENTORY:
- Alt-Click loading a pouch will give all items with quantity x995. *1 for TMHM/Key.
- Holding ALT when clicking Give All will clear all items for that pouch.
POKEPUFF:
- Control Click the All Button to give un-exceptional Pokepuffs.
- Control Click the Sort Button to sort in reverse.
WONDERCARD:
MYSTERY GIFT:
- Alt-Click QR to import from QR image.

View File

@@ -1 +1 @@
20160830
20160918

View File

@@ -798,4 +798,14 @@ B_Import = 导入
B_Output = 导出
B_Cancel = 取消
B_Save = 保存
! End
! -----------------------------------------------------
- DO NOT CHANGE THIS SECTION.
! ErrorWindow = Error
- Change stuff below this line, not above.
-------------------------------------------------------
L_ProvideInfo = Please provide this information when reporting this error:
B_CopyToClipboard = Copy to Clipboard
B_Continue = Continue
B_Abort = Abort
! End

View File

@@ -46,7 +46,7 @@ private void B_ImportPNG_Click(object sender, EventArgs e)
}
catch (Exception ex)
{
Util.Error(ex.Message);
Util.Error("An unexpected error has occurred.", ex);
}
}
private void B_ExportPNG_Click(object sender, EventArgs e)

View File

@@ -199,7 +199,7 @@ private void pbBoxSlot_MouseMove(object sender, MouseEventArgs e)
}
catch (Exception x)
{
Util.Error("Drag & Drop Error:", x.ToString());
Util.Error("Drag & Drop Error", x);
}
parent.notifyBoxViewerRefresh();
DragInfo.Reset();

View File

@@ -324,7 +324,7 @@ private void diffSaves()
}
catch (Exception e)
{
Util.Error(e.ToString());
Util.Error("An unexpected error has occurred.", e);
Console.Write(e);
}
TB_IsSet.Text = tbIsSet;
@@ -344,7 +344,7 @@ private void diffSaves()
}
catch (Exception e)
{
Util.Error(e.ToString());
Util.Error("An unexpected error has occurred.", e);
Console.Write(e);
}

View File

@@ -99,7 +99,7 @@ private void viewGiftData(MysteryGift g)
}
catch (Exception e)
{
Util.Error("Loading of data failed... is this really a Wonder Card?", e.ToString());
Util.Error("Loading of data failed... is this really a Wonder Card?", e);
RTB.Clear();
}
}
@@ -390,8 +390,8 @@ private void pbBoxSlot_MouseDown(object sender, MouseEventArgs e)
File.WriteAllBytes(newfile, card.Data);
DoDragDrop(new DataObject(DataFormats.FileDrop, new[] { newfile }), DragDropEffects.Move);
}
catch (ArgumentException x)
{ Util.Error("Drag & Drop Error:", x.ToString()); }
catch (Exception x)
{ Util.Error("Drag & Drop Error", x); }
File.Delete(newfile);
wc_slot = -1;
}

22
PKHeX/Util/DeployUtil.cs Normal file
View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PKHeX
{
public partial class Util
{
public static bool IsClickonceDeployed
{
get
{
#if CLICKONCE
return System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed;
#else
return false;
#endif
}
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using PKHeX.Misc;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
@@ -9,7 +10,7 @@ namespace PKHeX
{
public partial class Util
{
// Form Translation
#region Form Translation
internal static void TranslateInterface(Control form, string lang)
{
// Check to see if a the translation file exists in the same folder as the executable
@@ -113,20 +114,40 @@ internal static void CenterToForm(Control child, Control parent)
int y = parent.Location.Y + (parent.Height - child.Height) / 2;
child.Location = new Point(Math.Max(x, 0), Math.Max(y, 0));
}
#endregion
// Message Displays
#region Message Displays
/// <summary>
/// Displays a dialog showing the details of an error.
/// </summary>
/// <param name="friendlyMessage">User-friendly message about the error.</param>
/// <param name="exception">Instance of the error's <see cref="Exception"/>.</param>
/// <returns>The <see cref="DialogResult"/> associated with the dialog.</returns>
internal static DialogResult Error(string friendlyMessage, Exception exception)
{
System.Media.SystemSounds.Exclamation.Play();
return ErrorWindow.ShowErrorDialog(friendlyMessage, exception, true);
}
/// <summary>
/// Displays a dialog showing the details of an error.
/// </summary>
/// <param name="lines">User-friendly message about the error.</param>
/// <returns>The <see cref="DialogResult"/> associated with the dialog.</returns>
internal static DialogResult Error(params string[] lines)
{
System.Media.SystemSounds.Exclamation.Play();
string msg = string.Join(Environment.NewLine + Environment.NewLine, lines);
return MessageBox.Show(msg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
internal static DialogResult Alert(params string[] lines)
{
System.Media.SystemSounds.Asterisk.Play();
string msg = string.Join(Environment.NewLine + Environment.NewLine, lines);
return MessageBox.Show(msg, "Alert", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
internal static DialogResult Prompt(MessageBoxButtons btn, params string[] lines)
{
System.Media.SystemSounds.Question.Play();
@@ -152,5 +173,6 @@ public static void PanelScroll(object sender, ScrollEventArgs e)
break;
}
}
#endregion
}
}

View File

@@ -1,41 +1,36 @@
PKHeX
=====
![License](https://img.shields.io/badge/License-GPLv3-blue.svg)
Pokémon GBA/NDS/3DS save editor, programmed in [C#](https://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29).
Pokémon core series save editor, programmed in [C#](https://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29).
Supports the following files originating from the Nintendo GBA, NDS, & 3DS:
Supports the following files:
* Save files ("main", .sav)
* Individual Pokémon entity files (.pk*)
* Mystery Gift files (.pgt, .pcd, .pgf, .wc6) including conversion to .pk*
* Importing teams from Decrypted Battle Videos (X/Y/OR/AS only)
* Transferring of previous generation entities (.pkm) to future generation formats and save files
* Transferring from one generation to another, converting formats along the way.
Data is displayed in a view which can be edited and saved.
The interface can be translated with resource/external text files so that different languages can be supported.
Pokémon Showdown sets can be imported/exported in addition to QR codes.
Pokémon Showdown sets and QR codes can be imported/exported to assist in sharing.
Nintendo 3DS savedata containers use an AES MAC that cannot be emulated without the 3DS's keys, thus a resigning service is required (svdt, save_manager, or SaveDataFiler).
## Screenshots
![Main Window](http://i.imgur.com/GBub4le.png)
### License
PKHeX is licensed under GPLv3. Refer to LICENSE.md for more information.
![Main Window](http://i.imgur.com/QT3IxpR.png)
## Building
PKHeX can be compiled with any compiler that supports C# 6.0.
PKHeX is a Windows Forms application which requires .NET Framework v4.0.
The executable can be built with any compiler that supports C# 6.0.
### IDE
PKHeX can be opened with MS Visual Studio and [MonoDevelop](http://www.monodevelop.com/) by importing the project with the .sln or .csproj file.
### Command Line
You can use [xbuild of Mono](http://mono-framework.com/Microsoft.Build): `xbuild PKHeX.sln`.
PKHeX can be opened with IDEs such as [Visual Studio](https://www.visualstudio.com/) or [MonoDevelop](http://www.monodevelop.com/) by opening the .sln or .csproj file.
### GNU/Linux