mirror of
https://github.com/kwsch/PKHeX
synced 2024-11-22 12:03:10 +00:00
Various updates for next version
Added about-shortcuts and fixed a few things including secret base flags.
This commit is contained in:
parent
f6a8d99b51
commit
ea8c6d299a
11 changed files with 187 additions and 179 deletions
16
Misc/About.Designer.cs
generated
16
Misc/About.Designer.cs
generated
|
@ -33,6 +33,7 @@
|
|||
this.RTB = new System.Windows.Forms.RichTextBox();
|
||||
this.L_Thanks = new System.Windows.Forms.Label();
|
||||
this.L_Codr = new System.Windows.Forms.Label();
|
||||
this.B_Shortcuts = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// B_Close
|
||||
|
@ -74,17 +75,29 @@
|
|||
this.L_Codr.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.L_Codr.AutoSize = true;
|
||||
this.L_Codr.Location = new System.Drawing.Point(203, 345);
|
||||
this.L_Codr.Location = new System.Drawing.Point(163, 345);
|
||||
this.L_Codr.Name = "L_Codr";
|
||||
this.L_Codr.Size = new System.Drawing.Size(157, 13);
|
||||
this.L_Codr.TabIndex = 3;
|
||||
this.L_Codr.Text = "UI Inspiried by Codr\'s PokeGen.";
|
||||
//
|
||||
// B_Shortcuts
|
||||
//
|
||||
this.B_Shortcuts.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.B_Shortcuts.Location = new System.Drawing.Point(337, 340);
|
||||
this.B_Shortcuts.Name = "B_Shortcuts";
|
||||
this.B_Shortcuts.Size = new System.Drawing.Size(69, 23);
|
||||
this.B_Shortcuts.TabIndex = 4;
|
||||
this.B_Shortcuts.Text = "Shortcuts";
|
||||
this.B_Shortcuts.UseVisualStyleBackColor = true;
|
||||
this.B_Shortcuts.Click += new System.EventHandler(this.B_Shortcuts_Click);
|
||||
//
|
||||
// About
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(494, 372);
|
||||
this.Controls.Add(this.B_Shortcuts);
|
||||
this.Controls.Add(this.L_Codr);
|
||||
this.Controls.Add(this.L_Thanks);
|
||||
this.Controls.Add(this.RTB);
|
||||
|
@ -108,5 +121,6 @@
|
|||
private System.Windows.Forms.RichTextBox RTB;
|
||||
private System.Windows.Forms.Label L_Thanks;
|
||||
private System.Windows.Forms.Label L_Codr;
|
||||
private System.Windows.Forms.Button B_Shortcuts;
|
||||
}
|
||||
}
|
|
@ -20,5 +20,18 @@ namespace PKHeX
|
|||
{
|
||||
this.Close();
|
||||
}
|
||||
private void B_Shortcuts_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (B_Shortcuts.Text == "Shortcuts")
|
||||
{
|
||||
RTB.Text = PKHeX.Properties.Resources.shortcuts; // display shortcuts
|
||||
B_Shortcuts.Text = "Changelog";
|
||||
}
|
||||
else
|
||||
{
|
||||
RTB.Text = PKHeX.Properties.Resources.changelog; // display changelog
|
||||
B_Shortcuts.Text = "Shortcuts";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -129,6 +129,9 @@
|
|||
<metadata name="L_Codr.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="B_Shortcuts.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
|
|
|
@ -328,6 +328,7 @@
|
|||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Resources\text\shortcuts.txt" />
|
||||
<None Include="Resources\img\item\item_571.png" />
|
||||
<None Include="Resources\img\badges\badge_07.png" />
|
||||
<None Include="Resources\img\badges\badge_06.png" />
|
||||
|
|
21
PKX/f1-Main.Designer.cs
generated
21
PKX/f1-Main.Designer.cs
generated
|
@ -223,6 +223,7 @@
|
|||
this.Menu_Language = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.CB_MainLanguage = new System.Windows.Forms.ToolStripComboBox();
|
||||
this.Menu_About = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.Menu_Unicode = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.dragout = new System.Windows.Forms.Panel();
|
||||
this.eragout = new System.Windows.Forms.Panel();
|
||||
|
@ -331,7 +332,6 @@
|
|||
this.GB_SAVtools = new System.Windows.Forms.GroupBox();
|
||||
this.B_OpenSuperTraining = new System.Windows.Forms.Button();
|
||||
this.L_SAVINDEX = new System.Windows.Forms.Label();
|
||||
this.Menu_Unicode = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.tabMain.SuspendLayout();
|
||||
this.Tab_Main.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Label_IsShiny)).BeginInit();
|
||||
|
@ -1190,6 +1190,7 @@
|
|||
this.TB_MetLevel.Name = "TB_MetLevel";
|
||||
this.TB_MetLevel.Size = new System.Drawing.Size(122, 20);
|
||||
this.TB_MetLevel.TabIndex = 4;
|
||||
this.TB_MetLevel.TextChanged += new System.EventHandler(this.update255_MTB);
|
||||
//
|
||||
// CAL_MetDate
|
||||
//
|
||||
|
@ -2176,7 +2177,7 @@
|
|||
this.Label_CTGender.TabIndex = 57;
|
||||
this.Label_CTGender.Text = "G";
|
||||
this.Label_CTGender.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.Label_CTGender.Click += new System.EventHandler(this.Label_CTGender_Click);
|
||||
this.Label_CTGender.Click += new System.EventHandler(this.Label_TrainerGender_Click);
|
||||
//
|
||||
// TB_OTt2
|
||||
//
|
||||
|
@ -2465,7 +2466,7 @@
|
|||
this.Label_OTGender.TabIndex = 56;
|
||||
this.Label_OTGender.Text = "G";
|
||||
this.Label_OTGender.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.Label_OTGender.Click += new System.EventHandler(this.Label_OTGender_Click);
|
||||
this.Label_OTGender.Click += new System.EventHandler(this.Label_TrainerGender_Click);
|
||||
//
|
||||
// TB_OT
|
||||
//
|
||||
|
@ -2680,6 +2681,13 @@
|
|||
this.Menu_About.Text = "A&bout PKHeX";
|
||||
this.Menu_About.Click += new System.EventHandler(this.mainmenuAbout);
|
||||
//
|
||||
// Menu_Unicode
|
||||
//
|
||||
this.Menu_Unicode.Name = "Menu_Unicode";
|
||||
this.Menu_Unicode.Size = new System.Drawing.Size(183, 22);
|
||||
this.Menu_Unicode.Text = "Toggle Unicode Text";
|
||||
this.Menu_Unicode.Click += new System.EventHandler(this.Menu_Unicode_Click);
|
||||
//
|
||||
// testToolStripMenuItem
|
||||
//
|
||||
this.testToolStripMenuItem.Name = "testToolStripMenuItem";
|
||||
|
@ -4017,13 +4025,6 @@
|
|||
this.L_SAVINDEX.TabIndex = 16;
|
||||
this.L_SAVINDEX.Text = "0";
|
||||
//
|
||||
// Menu_Unicode
|
||||
//
|
||||
this.Menu_Unicode.Name = "Menu_Unicode";
|
||||
this.Menu_Unicode.Size = new System.Drawing.Size(183, 22);
|
||||
this.Menu_Unicode.Text = "Toggle Unicode Text";
|
||||
this.Menu_Unicode.Click += new System.EventHandler(this.Menu_Unicode_Click);
|
||||
//
|
||||
// Form1
|
||||
//
|
||||
this.AllowDrop = true;
|
||||
|
|
255
PKX/f1-Main.cs
255
PKX/f1-Main.cs
|
@ -2303,18 +2303,13 @@ namespace PKHeX
|
|||
else Label_CTGender.Text = gendersymbols[0]; // ♂
|
||||
}
|
||||
}
|
||||
private void Label_OTGender_Click(object sender, EventArgs e)
|
||||
private void Label_TrainerGender_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (PKX.getGender(Label_OTGender.Text) == 0) // ♂
|
||||
Label_OTGender.Text = gendersymbols[1]; // ♀
|
||||
else Label_OTGender.Text = gendersymbols[0]; // ♂
|
||||
}
|
||||
private void Label_CTGender_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (Label_CTGender.Text == "") return;
|
||||
else if (PKX.getGender(Label_CTGender.Text) == 0) // ♂
|
||||
Label_CTGender.Text = gendersymbols[1]; // ♀
|
||||
else Label_CTGender.Text = gendersymbols[0]; // ♂
|
||||
Label lbl = sender as Label;
|
||||
if (lbl.Text == "")
|
||||
return;
|
||||
else // set gender label (toggle M/F)
|
||||
lbl.Text = (PKX.getGender(lbl.Text) == 0) ? gendersymbols[1] : gendersymbols[0];
|
||||
}
|
||||
// Prompted Updates of PKX Functions //
|
||||
public void setCountry(object sender)
|
||||
|
@ -2493,6 +2488,8 @@ namespace PKHeX
|
|||
}
|
||||
private void updateIVs(object sender, EventArgs e)
|
||||
{
|
||||
if (sender != null)
|
||||
(sender as MaskedTextBox).Text = Math.Min(Util.ToInt32((sender as MaskedTextBox).Text), 31).ToString();
|
||||
int ivtotal, HP_IV, ATK_IV, DEF_IV, SPA_IV, SPD_IV, SPE_IV;
|
||||
HP_IV = Util.ToInt32(TB_HPIV.Text);
|
||||
ATK_IV = Util.ToInt32(TB_ATKIV.Text);
|
||||
|
@ -2504,18 +2501,6 @@ namespace PKHeX
|
|||
int[] iva = new int[] { HP_IV, ATK_IV, DEF_IV, SPE_IV, SPA_IV, SPD_IV };
|
||||
MaskedTextBox[] ivt = { TB_HPIV, TB_ATKIV, TB_DEFIV, TB_SPEIV, TB_SPAIV, TB_SPDIV };
|
||||
|
||||
bool exitfunction = false;
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
if (iva[i] > 31)
|
||||
{
|
||||
ivt[i].BackColor = Color.Red;
|
||||
exitfunction = true;
|
||||
}
|
||||
else ivt[i].BackColor = Color.White;
|
||||
}
|
||||
if (exitfunction) return;
|
||||
|
||||
int HPTYPE = (15 * ((HP_IV & 1) + 2 * (ATK_IV & 1) + 4 * (DEF_IV & 1) + 8 * (SPE_IV & 1) + 16 * (SPA_IV & 1) + 32 * (SPD_IV & 1))) / 63;
|
||||
Label_HPTYPE.Text = types[HPTYPE+1]; // type array has normal at index 0, so we offset by 1
|
||||
|
||||
|
@ -2546,7 +2531,6 @@ namespace PKHeX
|
|||
L_Potential.Text = "++++";
|
||||
}
|
||||
|
||||
|
||||
// Characteristic with PID%6
|
||||
int pm6 = (int)(Util.getHEXval(TB_PID) % 6); // PID MOD 6
|
||||
int maxIV = iva.Max();
|
||||
|
@ -2564,6 +2548,8 @@ namespace PKHeX
|
|||
}
|
||||
private void updateEVs(object sender, EventArgs e)
|
||||
{
|
||||
if (sender != null)
|
||||
(sender as MaskedTextBox).Text = Math.Min(Util.ToInt32((sender as MaskedTextBox).Text), 252).ToString();
|
||||
int evtotal, HP_EV, ATK_EV, DEF_EV, SPA_EV, SPD_EV, SPE_EV;
|
||||
HP_EV = Util.ToInt32(TB_HPEV.Text);
|
||||
ATK_EV = Util.ToInt32(TB_ATKEV.Text);
|
||||
|
@ -2572,19 +2558,8 @@ namespace PKHeX
|
|||
SPD_EV = Util.ToInt32(TB_SPDEV.Text);
|
||||
SPE_EV = Util.ToInt32(TB_SPEEV.Text);
|
||||
|
||||
int[] iva = new int[] { HP_EV, ATK_EV, DEF_EV, SPA_EV, SPD_EV, SPE_EV };
|
||||
MaskedTextBox[] ivt = { TB_HPEV, TB_ATKEV, TB_DEFEV, TB_SPAEV, TB_SPDEV, TB_SPEEV };
|
||||
|
||||
for (int i = 0; i < 6; i++) // if illegal, mark the box as illegal
|
||||
{
|
||||
if (iva[i] > 252)
|
||||
ivt[i].BackColor = Color.Red;
|
||||
else ivt[i].BackColor = Color.White;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 6; i++) // if totally illegal, don't continue.
|
||||
if (iva[i] > 255)
|
||||
return;
|
||||
int[] eva = new int[] { HP_EV, ATK_EV, DEF_EV, SPA_EV, SPD_EV, SPE_EV };
|
||||
MaskedTextBox[] evt = { TB_HPEV, TB_ATKEV, TB_DEFEV, TB_SPAEV, TB_SPDEV, TB_SPEEV };
|
||||
|
||||
evtotal = HP_EV + ATK_EV + DEF_EV + SPA_EV + SPD_EV + SPE_EV;
|
||||
|
||||
|
@ -2608,14 +2583,16 @@ namespace PKHeX
|
|||
TB_SPAIV.Text = 31.ToString();
|
||||
TB_SPDIV.Text = 31.ToString();
|
||||
TB_SPEIV.Text = 31.ToString();
|
||||
return;
|
||||
}
|
||||
TB_HPIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_ATKIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_DEFIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_SPAIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_SPDIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_SPEIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
else
|
||||
{
|
||||
TB_HPIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_ATKIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_DEFIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_SPAIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_SPDIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
TB_SPEIV.Text = (Util.rnd32() & 0x1F).ToString();
|
||||
}
|
||||
}
|
||||
private void updateRandomEVs(object sender, EventArgs e)
|
||||
{
|
||||
|
@ -2677,8 +2654,7 @@ namespace PKHeX
|
|||
MaskedTextBox mtb = sender as MaskedTextBox;
|
||||
try
|
||||
{
|
||||
int val = Util.ToInt32(mtb.Text);
|
||||
if (val > 255) mtb.Text = "255";
|
||||
mtb.Text = Math.Min(Util.ToInt32(mtb.Text), 255).ToString();
|
||||
}
|
||||
catch { mtb.Text = "0"; }
|
||||
}
|
||||
|
@ -2687,8 +2663,7 @@ namespace PKHeX
|
|||
TextBox tb = sender as TextBox;
|
||||
try
|
||||
{
|
||||
int val = Util.ToInt32(tb.Text);
|
||||
if (val > 255) tb.Text = "255";
|
||||
tb.Text = Math.Min(Util.ToInt32(tb.Text), 255).ToString();
|
||||
}
|
||||
catch { tb.Text = "0"; }
|
||||
}
|
||||
|
@ -2761,12 +2736,8 @@ namespace PKHeX
|
|||
genderflag = 1;
|
||||
else if (gt == 256) // Male Only
|
||||
genderflag = 0;
|
||||
else
|
||||
{ // get gender from old PID correlation
|
||||
if ((Util.getHEXval(TB_PID) & 0xFF) < gt)
|
||||
genderflag = 1;
|
||||
else genderflag = 0;
|
||||
}
|
||||
else // get gender from old PID correlation
|
||||
genderflag = ((Util.getHEXval(TB_PID) & 0xFF) < gt) ? 1 : 0;
|
||||
|
||||
setGenderLabel();
|
||||
updateAbilityList(TB_AbilityNumber, Util.getIndex(CB_Species), CB_Ability, CB_Form);
|
||||
|
@ -3134,8 +3105,7 @@ namespace PKHeX
|
|||
MaskedTextBox mtb = sender as MaskedTextBox;
|
||||
try
|
||||
{
|
||||
int val = Util.ToInt32(mtb.Text);
|
||||
if (val > 255) mtb.Text = "255";
|
||||
mtb.Text = Math.Min(Util.ToInt32(mtb.Text), 255).ToString();
|
||||
}
|
||||
catch { mtb.Text = "0"; }
|
||||
|
||||
|
@ -3267,9 +3237,6 @@ namespace PKHeX
|
|||
// Display hatch counter if it is an egg, Display Friendship if it is not.
|
||||
Label_HatchCounter.Visible = CHK_IsEgg.Checked;
|
||||
Label_Friendship.Visible = !CHK_IsEgg.Checked;
|
||||
// Disable
|
||||
// CB_MetLocation.Enabled = !CHK_IsEgg.Checked;
|
||||
// CAL_MetDate.Enabled = !CHK_IsEgg.Checked;
|
||||
}
|
||||
private void updateMetAsEgg(object sender, EventArgs e)
|
||||
{
|
||||
|
@ -3305,13 +3272,11 @@ namespace PKHeX
|
|||
TB_PID.Text = Util.getHEXval(TB_PID).ToString("X8");
|
||||
TB_EC.Text = Util.getHEXval(TB_EC).ToString("X8");
|
||||
|
||||
if (Util.ToUInt32(TB_TID.Text) > 0xFFFF)
|
||||
TB_TID.Text = TB_TID.Text.Remove(TB_TID.Text.Length - 1);
|
||||
if (Util.ToUInt32(TB_TID.Text) > 0xFFFF)
|
||||
TB_SID.Text = TB_SID.Text.Remove(TB_SID.Text.Length - 1);
|
||||
TB_TID.Text = Math.Min(Util.ToUInt32(TB_TID.Text), 65535).ToString(); // max TID/SID is 65535
|
||||
TB_SID.Text = Math.Min(Util.ToUInt32(TB_SID.Text), 65535).ToString();
|
||||
|
||||
setIsShiny();
|
||||
updateIVs(sender, e); // If the PID is changed, PID%6 (Characteristic) might be changed.
|
||||
updateIVs(null, null); // If the PID is changed, PID%6 (Characteristic) might be changed.
|
||||
TB_PID.Select(60, 0); // position cursor at end of field
|
||||
}
|
||||
private void validateComboBox(object sender, CancelEventArgs e)
|
||||
|
@ -3444,9 +3409,7 @@ namespace PKHeX
|
|||
|
||||
// ORAS Stats
|
||||
else if ((form == 1) && (species == 382)) { HP_B = 100; ATK_B = 150; DEF_B = 90; SPA_B = 180; SPD_B = 160; SPE_B = 90; } // Primal Kyogre
|
||||
else if ((form == 1) && (species == 383)) { HP_B = 100; ATK_B = 180; DEF_B = 160; SPA_B = 150; SPD_B = 90; SPE_B = 90; } // Primal Groudon
|
||||
|
||||
else if ((form == 1) && (species == 720)) { HP_B = 80; ATK_B = 160; DEF_B = 60; SPA_B = 170; SPD_B = 130; SPE_B = 80; } // Hoopa
|
||||
else if ((form == 1) && (species == 383)) { HP_B = 100; ATK_B = 180; DEF_B = 160; SPA_B = 150; SPD_B = 90; SPE_B = 90; } // Primal
|
||||
|
||||
else if ((form == 1) && (species == 015)) { HP_B = 65; ATK_B = 150; DEF_B = 40; SPA_B = 15; SPD_B = 80; SPE_B = 145; } // Beedrill
|
||||
else if ((form == 1) && (species == 018)) { HP_B = 83; ATK_B = 80; DEF_B = 83; SPA_B = 135; SPD_B = 80; SPE_B = 121; } // Pidgeot
|
||||
|
@ -3467,7 +3430,7 @@ namespace PKHeX
|
|||
else if ((form == 1) && (species == 531)) { HP_B = 103; ATK_B = 60; DEF_B = 126; SPA_B = 80; SPD_B = 126; SPE_B = 50; } // Audino
|
||||
else if ((form == 1) && (species == 719)) { HP_B = 50; ATK_B = 160; DEF_B = 110; SPA_B = 160; SPD_B = 110; SPE_B = 110; } // Diancie
|
||||
|
||||
// 015, 018, 080, 208, 254, 260, 302, 319, 323, 334, 362, 373, 376, 384, 428, 475, 531, 719,
|
||||
else if ((form == 1) && (species == 720)) { HP_B = 80; ATK_B = 160; DEF_B = 60; SPA_B = 170; SPD_B = 130; SPE_B = 80; } // Hoopa Unbound
|
||||
}
|
||||
// End Form Stat Recalc
|
||||
|
||||
|
@ -3643,11 +3606,8 @@ namespace PKHeX
|
|||
|
||||
if ((ext == ".ekx") || (ext == ".bin") || (ext == ".pkx") || (ext == ".ek6") || (ext == ".pk6"))
|
||||
{
|
||||
if ((ext == ".ekx") || (ext == ".bin") || (ext == ".ek6"))
|
||||
{
|
||||
// User Requested Encrypted File
|
||||
if ((ext == ".ekx") || (ext == ".bin") || (ext == ".ek6")) // User Requested Encrypted File
|
||||
pkx = PKX.encryptArray(pkx);
|
||||
}
|
||||
File.WriteAllBytes(path, pkx.ToArray());
|
||||
}
|
||||
else
|
||||
|
@ -3656,7 +3616,7 @@ namespace PKHeX
|
|||
string caption = "Error Detected in Input";
|
||||
MessageBox.Show(message, caption);
|
||||
pkx = PKX.encryptArray(pkx);
|
||||
File.WriteAllBytes(path, pkx.ToArray());
|
||||
File.WriteAllBytes(path, pkx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3667,8 +3627,7 @@ namespace PKHeX
|
|||
private void mainmenuAbout(object sender, EventArgs e)
|
||||
{
|
||||
// Open a new form with the About details.
|
||||
PKHeX.About about = new PKHeX.About();
|
||||
about.ShowDialog();
|
||||
new About().ShowDialog();
|
||||
}
|
||||
private void mainmenuWiden(object sender, EventArgs e)
|
||||
{
|
||||
|
@ -3682,7 +3641,7 @@ namespace PKHeX
|
|||
else
|
||||
newwidth = shortWidth;
|
||||
|
||||
this.Width = newwidth;
|
||||
Width = newwidth;
|
||||
}
|
||||
private void mainmenuCodeGen(object sender, EventArgs e)
|
||||
{
|
||||
|
@ -3694,10 +3653,7 @@ namespace PKHeX
|
|||
{
|
||||
byte[] decdata = PKX.decryptArray(data);
|
||||
Array.Copy(decdata, buff, 232);
|
||||
try
|
||||
{
|
||||
populateFields(buff);
|
||||
}
|
||||
try { populateFields(buff); }
|
||||
catch
|
||||
{
|
||||
Array.Copy(new Byte[232], buff, 232);
|
||||
|
@ -3812,7 +3768,7 @@ namespace PKHeX
|
|||
if (sdr == DialogResult.Cancel)
|
||||
{
|
||||
savindex = 0;
|
||||
return;
|
||||
return; // abort load
|
||||
}
|
||||
else if (sdr == DialogResult.Yes)
|
||||
{
|
||||
|
@ -3893,7 +3849,6 @@ namespace PKHeX
|
|||
{
|
||||
L_Save.Text = "SAV: " + Path.GetFileName(path);
|
||||
SaveGame = new SaveGames.SaveStruct(GameType);
|
||||
savegame_oras = oras;
|
||||
|
||||
// Load CyberGadget
|
||||
this.savindex = 0;
|
||||
|
@ -3932,20 +3887,21 @@ namespace PKHeX
|
|||
Array.Copy(savefile, 0x43C - 1 * 0x130, realHash2, 0, 0x20);
|
||||
|
||||
B_SwitchSAV.Enabled = (hashValue1.SequenceEqual(realHash1) && hashValue2.SequenceEqual(realHash2));
|
||||
getSAVOffsets();
|
||||
getSAVOffsets(); // just in case
|
||||
Array.Copy(savefile, 0x5400 + 0x7F000 * savindex, cyberSAV, 0, cyberSAV.Length);
|
||||
|
||||
openSave(oras);
|
||||
}
|
||||
private void openSave(bool oras)
|
||||
{
|
||||
savegame_oras = oras;
|
||||
// Enable Secondary Tools
|
||||
GB_SAVtools.Enabled =
|
||||
tabBoxMulti.Enabled = true;
|
||||
B_JPEG.Enabled =
|
||||
B_BoxIO.Enabled =
|
||||
B_VerifyCHK.Enabled = true;
|
||||
B_VerifySHA.Enabled = B_SwitchSAV.Enabled = false;
|
||||
tabBoxMulti.Enabled = true;
|
||||
|
||||
savedited = false;
|
||||
Menu_ToggleBoxUI.Visible = false;
|
||||
|
@ -3969,13 +3925,11 @@ namespace PKHeX
|
|||
// Secondary Windows for Ribbons/Amie/Memories
|
||||
private void openribbons(object sender, EventArgs e)
|
||||
{
|
||||
PKHeX.RibbMedal f3 = new PKHeX.RibbMedal(this);
|
||||
f3.ShowDialog();
|
||||
new RibbMedal(this).ShowDialog();
|
||||
}
|
||||
private void openhistory(object sender, EventArgs e)
|
||||
{
|
||||
PKHeX.MemoryAmie f4 = new PKHeX.MemoryAmie(this);
|
||||
f4.ShowDialog();
|
||||
new MemoryAmie(this).ShowDialog();
|
||||
}
|
||||
// Open/Save Array Manipulation //
|
||||
public bool verifiedpkx()
|
||||
|
@ -4005,27 +3959,9 @@ namespace PKHeX
|
|||
}
|
||||
}
|
||||
#endregion
|
||||
#region TextBoxes
|
||||
// Further logic checking
|
||||
MaskedTextBox[] tba = new MaskedTextBox[]
|
||||
{
|
||||
TB_HPEV,TB_ATKEV,TB_DEFEV,TB_SPAEV,TB_SPDEV,TB_SPEEV,
|
||||
TB_HPIV,TB_ATKIV,TB_DEFIV,TB_SPAIV,TB_SPDIV,TB_SPEIV,
|
||||
};
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
if (((Util.ToInt32(tba[i].Text) > 252) && !(CHK_HackedStats.Checked && Util.ToInt32(tba[i].Text) < 256)) || (Util.ToInt32(tba[i + 6].Text) > 31))
|
||||
{
|
||||
tabMain.SelectedIndex = 2;
|
||||
goto invalid;
|
||||
}
|
||||
}
|
||||
if (Convert.ToUInt32(TB_EVTotal.Text) > 510 && !CHK_HackedStats.Checked)
|
||||
{
|
||||
tabMain.SelectedIndex = 2;
|
||||
goto invalid;
|
||||
}
|
||||
#endregion
|
||||
{ tabMain.SelectedIndex = 2; goto invalid; }
|
||||
if (Util.getIndex(CB_Species) == 0) // Not gonna write 0 species.
|
||||
{ tabMain.SelectedIndex = 0; goto invalid; }
|
||||
|
||||
|
@ -5156,25 +5092,23 @@ namespace PKHeX
|
|||
}
|
||||
private void cloneBox(object sender, EventArgs e)
|
||||
{
|
||||
if (!verifiedpkx()) { return; }
|
||||
int slot = getSlot(sender);
|
||||
if (slot > 30) return;
|
||||
if (!verifiedpkx()) { return; } // don't copy garbage to the box
|
||||
if (getSlot(sender) > 30) return; // only perform action if cloning to boxes
|
||||
|
||||
int box = C_BoxSelect.SelectedIndex + 1;
|
||||
int box = C_BoxSelect.SelectedIndex + 1; // get box we're cloning to
|
||||
{
|
||||
DialogResult sdr = MessageBox.Show(String.Format("Clone Pokemon from Editing Tabs to all slots in Box {0}?",box), "Prompt", MessageBoxButtons.YesNo);
|
||||
if (sdr != DialogResult.Yes)
|
||||
if (sdr != DialogResult.Yes) // give the option to abort
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
byte[] pkxdata = preparepkx(buff);
|
||||
byte[] ekxdata = PKX.encryptArray(pkxdata);
|
||||
for (int i = 0; i < 30; i++)
|
||||
for (int i = 0; i < 30; i++) // write encrypted array to all box slots
|
||||
Array.Copy(ekxdata, 0, savefile, getPKXOffset(i), 0xE8);
|
||||
|
||||
setPokedex(pkxdata);
|
||||
setPKXBoxes();
|
||||
setPokedex(pkxdata); // set pokedex data if necessary
|
||||
setPKXBoxes(); // refresh box view
|
||||
savedited = true;
|
||||
}
|
||||
private void setPokedex(byte[] pkxdata)
|
||||
|
@ -5207,7 +5141,7 @@ namespace PKHeX
|
|||
}
|
||||
private byte setParty()
|
||||
{
|
||||
byte partymembers = 0;
|
||||
byte partymembers = 0; // start off with a ctr of 0
|
||||
int offset = SaveGame.Party + 0x7F000 * savindex;
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
|
@ -5222,6 +5156,7 @@ namespace PKHeX
|
|||
partymembers++; // Copy in our party member
|
||||
}
|
||||
}
|
||||
|
||||
// Write in the current party count
|
||||
savefile[offset + 6 * 0x104 + savindex * 0x7F000] = partymembers;
|
||||
// Zero out the party slots that are empty.
|
||||
|
@ -5350,21 +5285,18 @@ namespace PKHeX
|
|||
int offset = SaveGame.Party + (0x7F000 * savindex) + 0x104 * i;
|
||||
getSlotFiller(offset, pba[i + 30]);
|
||||
}
|
||||
|
||||
// Reload Battle Box
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
int offset = SaveGame.BattleBox + (0x7F000 * savindex) + 0xE8 * i;
|
||||
getSlotFiller(offset, pba[i + 36]);
|
||||
}
|
||||
|
||||
// Reload Daycare
|
||||
Label[] dclabela = {
|
||||
L_DC1,
|
||||
L_DC2,
|
||||
};
|
||||
TextBox[] dctexta = {
|
||||
TB_Daycare1XP,
|
||||
TB_Daycare2XP,
|
||||
};
|
||||
Label[] dclabela = { L_DC1, L_DC2, };
|
||||
TextBox[] dctexta = { TB_Daycare1XP, TB_Daycare2XP };
|
||||
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
int offset = SaveGame.Daycare + (0x7F000 * savindex) + 0xE8 * i + 8 * (i + 1);
|
||||
|
@ -5431,7 +5363,7 @@ namespace PKHeX
|
|||
private void setSAVLabel()
|
||||
{
|
||||
L_SAVINDEX.Text = (savindex + 1).ToString();
|
||||
RTB_S.Text += "\r\nLoaded Save File " + (savindex + 1).ToString();
|
||||
RTB_S.AppendText("Loaded Save File " + (savindex + 1).ToString() + "\n");
|
||||
}
|
||||
private void getSAVOffsets()
|
||||
{
|
||||
|
@ -5479,8 +5411,7 @@ namespace PKHeX
|
|||
|
||||
if (species == 0)
|
||||
{ pb.Image = (Image)Properties.Resources.ResourceManager.GetObject("_0"); return; }
|
||||
// if (isegg == 1)
|
||||
// { file = "egg"; }
|
||||
|
||||
else
|
||||
{
|
||||
file = "_" + species.ToString();
|
||||
|
@ -5778,31 +5709,26 @@ namespace PKHeX
|
|||
private void B_OpenWondercards_Click(object sender, EventArgs e)
|
||||
{
|
||||
// Open Wondercard Menu
|
||||
PKHeX.SAV_Wondercard sb32 = new PKHeX.SAV_Wondercard(this);
|
||||
sb32.ShowDialog();
|
||||
new SAV_Wondercard(this).ShowDialog();
|
||||
}
|
||||
private void B_OpenBoxLayout_Click(object sender, EventArgs e)
|
||||
{
|
||||
// Open Box Layout Menu
|
||||
PKHeX.SAV_BoxLayout sb21 = new PKHeX.SAV_BoxLayout(this);
|
||||
sb21.ShowDialog();
|
||||
setBoxNames();
|
||||
setPKXBoxes();
|
||||
new SAV_BoxLayout(this).ShowDialog();
|
||||
setBoxNames(); // fix box names
|
||||
setPKXBoxes(); // refresh box background
|
||||
}
|
||||
private void B_OpenTrainerInfo_Click(object sender, EventArgs e)
|
||||
{
|
||||
PKHeX.SAV_Trainer sb13 = new PKHeX.SAV_Trainer(this);
|
||||
sb13.ShowDialog();
|
||||
new SAV_Trainer(this).ShowDialog();
|
||||
}
|
||||
private void B_OpenPokepuffs_Click(object sender, EventArgs e)
|
||||
{
|
||||
PKHeX.SAV_Pokepuff sb11 = new PKHeX.SAV_Pokepuff(this);
|
||||
sb11.ShowDialog();
|
||||
new SAV_Pokepuff(this).ShowDialog();
|
||||
}
|
||||
private void B_OpenItemPouch_Click(object sender, EventArgs e)
|
||||
{
|
||||
PKHeX.SAV_Inventory sb12 = new PKHeX.SAV_Inventory(this);
|
||||
sb12.ShowDialog();
|
||||
new SAV_Inventory(this).ShowDialog();
|
||||
}
|
||||
private void B_OpenBerryField_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
@ -5814,7 +5740,7 @@ namespace PKHeX
|
|||
// Randomize the trees.
|
||||
int offset = 0x1C400 + 0x5400 + savindex * 0x7F000;
|
||||
byte[] ready = new byte[] { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0x40, 0x01, 0x00, 0x00, 0x00, };
|
||||
int[] itemlist = new int[]
|
||||
int[] berrylist = new int[]
|
||||
{
|
||||
0,149,150,151,152,153,154,155,156,157,158,159,160,161,162,
|
||||
163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,
|
||||
|
@ -5824,25 +5750,28 @@ namespace PKHeX
|
|||
};
|
||||
for (int i = 0; i < 90; i++)
|
||||
{
|
||||
Array.Copy(ready, 0, savefile, offset + 0x10 * i, 0x10);
|
||||
Array.Copy(BitConverter.GetBytes(itemlist[Util.rnd32() % itemlist.Length]), 0, savefile, offset + 0x10 * i + 6, 2);
|
||||
Array.Copy(ready, 0, savefile, offset + 0x10 * i, 0x10); // prep the berry template tree (which we replace offset 0x6 for the Tree Item)
|
||||
int randberry = (int)(Util.rnd32() % berrylist.Length); // generate a random berry that will go into the tree
|
||||
int index = berrylist[randberry]; // get berry item ID from list
|
||||
Array.Copy(BitConverter.GetBytes(index), 0, savefile, offset + 0x10 * i + 6, 2); // put berry into tree.
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
(new PKHeX.SAV_BerryField(this, SaveGame.BerryField)).ShowDialog();
|
||||
new SAV_BerryField(this, SaveGame.BerryField).ShowDialog();
|
||||
}
|
||||
private void B_OpenEventFlags_Click(object sender, EventArgs e)
|
||||
{
|
||||
// Open Flag Menu
|
||||
if (savegame_oras) (new PKHeX.SAV_EventFlagsORAS(this)).ShowDialog();
|
||||
else (new PKHeX.SAV_EventFlagsXY(this)).ShowDialog();
|
||||
if (savegame_oras)
|
||||
new SAV_EventFlagsORAS(this).ShowDialog();
|
||||
else
|
||||
new SAV_EventFlagsXY(this).ShowDialog();
|
||||
}
|
||||
private void B_OpenSuperTraining_Click(object sender, EventArgs e)
|
||||
{
|
||||
// Open ST Menu
|
||||
SAV_SuperTrain supertrain = new PKHeX.SAV_SuperTrain(this);
|
||||
supertrain.ShowDialog();
|
||||
new SAV_SuperTrain(this).ShowDialog();
|
||||
}
|
||||
private void B_OpenOPowers_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
@ -5874,16 +5803,17 @@ namespace PKHeX
|
|||
};
|
||||
Array.Copy(maxoras, 0, savefile, 0x17400 + 0x5400 + 0x7F000 * savindex, 0x44);
|
||||
}
|
||||
return;
|
||||
}
|
||||
SAV_OPower opower = new PKHeX.SAV_OPower(this);
|
||||
opower.ShowDialog();
|
||||
else
|
||||
new SAV_OPower(this).ShowDialog();
|
||||
}
|
||||
private void B_OpenPokedex_Click(object sender, EventArgs e)
|
||||
{
|
||||
// Open Pokedex Menu
|
||||
if (savegame_oras) (new PKHeX.SAV_PokedexORAS(this)).ShowDialog();
|
||||
else (new PKHeX.SAV_PokedexXY(this)).ShowDialog();
|
||||
if (savegame_oras)
|
||||
new SAV_PokedexORAS(this).ShowDialog();
|
||||
else
|
||||
new SAV_PokedexXY(this).ShowDialog();
|
||||
}
|
||||
private void B_OUTPasserby_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
@ -5952,14 +5882,12 @@ namespace PKHeX
|
|||
private void B_OUTHallofFame_Click(object sender, EventArgs e)
|
||||
{
|
||||
// Open HoF Menu
|
||||
SAV_HallOfFame halloffame = new PKHeX.SAV_HallOfFame(this);
|
||||
halloffame.ShowDialog();
|
||||
new SAV_HallOfFame(this).ShowDialog();
|
||||
}
|
||||
private void B_OpenSecretBase_Click(object sender, EventArgs e)
|
||||
{
|
||||
// Open Secret Base Menu
|
||||
SAV_SecretBase secretbase = new PKHeX.SAV_SecretBase(this);
|
||||
secretbase.ShowDialog();
|
||||
new SAV_SecretBase(this).ShowDialog();;
|
||||
}
|
||||
|
||||
private void B_OpenTemp_Click(object sender, EventArgs e)
|
||||
|
@ -6028,8 +5956,7 @@ namespace PKHeX
|
|||
private void B_BoxIO_Click(object sender, EventArgs e)
|
||||
{
|
||||
// Allow Import/Export of Boxes
|
||||
PKHeX.SAV_BoxIO boxio = new PKHeX.SAV_BoxIO(this, SaveGame.Box, SaveGame.PCLayout);
|
||||
boxio.ShowDialog();
|
||||
new PKHeX.SAV_BoxIO(this, SaveGame.Box, SaveGame.PCLayout).ShowDialog();
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
@ -6135,7 +6062,8 @@ namespace PKHeX
|
|||
// Force an update to the met locations
|
||||
origintrack = "";
|
||||
|
||||
updateIVs(null, null); // Prompt an update for the characteristics
|
||||
if (init)
|
||||
updateIVs(null, null); // Prompt an update for the characteristics
|
||||
}
|
||||
|
||||
// Drag & Drop within Box
|
||||
|
@ -6176,15 +6104,12 @@ namespace PKHeX
|
|||
|
||||
string[] filesToDrag = { newfile };
|
||||
(sender as PictureBox).DoDragDrop(new DataObject(DataFormats.FileDrop, filesToDrag), DragDropEffects.Move);
|
||||
File.Delete(newfile);
|
||||
File.Delete(newfile); // after drop, delete the temporary file
|
||||
}
|
||||
catch (ArgumentException x)
|
||||
{ MessageBox.Show("Drag&Drop Error\n\n" + x, "Error"); }
|
||||
File.Delete(newfile);
|
||||
pkm_from_offset = 0;
|
||||
//Array.Copy(savefile, offset, pkm_from, 0, 0xE8);
|
||||
//pkm_from_offset = offset;
|
||||
//(sender as PictureBox).DoDragDrop(pkm_from, DragDropEffects.Move);
|
||||
}
|
||||
}
|
||||
private void pbBoxSlot_DragDrop(object sender, DragEventArgs e)
|
||||
|
@ -6222,7 +6147,7 @@ namespace PKHeX
|
|||
if (fi.Extension == ".pkx" || fi.Extension == ".pk6")
|
||||
data = PKX.encryptArray(data);
|
||||
else if (fi.Extension != ".ekx" || fi.Extension != ".ekx")
|
||||
openQuick(files[0]);
|
||||
{ openQuick(files[0]); return; } // lazy way of aborting
|
||||
|
||||
Array.Copy(data, 0, savefile, offset, 0xE8);
|
||||
}
|
||||
|
|
9
Properties/Resources.Designer.cs
generated
9
Properties/Resources.Designer.cs
generated
|
@ -14939,6 +14939,15 @@ namespace PKHeX.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to .
|
||||
/// </summary>
|
||||
internal static string shortcuts {
|
||||
get {
|
||||
return ResourceManager.GetString("shortcuts", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
|
|
|
@ -5149,4 +5149,7 @@
|
|||
<data name="item_571" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\img\item\item_571.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="shortcuts" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\text\shortcuts.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
</root>
|
|
@ -378,4 +378,14 @@ http://projectpokemon.org/forums/showthread.php?36986
|
|||
- Added: Partially decrypted Powersaves game loading, view only.
|
||||
- Added: Eon Ticket wondercard injection now adds the required data. It is now safe to add the extracted wondercard.
|
||||
- Added: More rebattle flags; Virizion may not be correct but it's our best guess.
|
||||
- - Rebattling Lati@s has yet to be ironed out, we haven't figured out how to go back to the island.
|
||||
- - Rebattling Lati@s has yet to be ironed out, we haven't figured out how to go back to the island.
|
||||
|
||||
12/6/14 - New Update:
|
||||
- Added: Unicode Gender text toggle in Options.
|
||||
- Fixed: Shiny Star will now appear in boxes.
|
||||
- Fixed: Gendered formes will now appear properly in boxes.
|
||||
- Fixed: verifychecksum input length error when past gen pkm were imported.
|
||||
- Fixed: Bad egg setting via first slot drag (very uncommon, thanks Slashmolder for finding this!)
|
||||
- Improved: Bad egg detection for zeroed data in actual saves.
|
||||
- Changed: Secret Base Flag read offset to use the PSS stat 0x140 one, should be correct. Previous offset was the flag counter on QR code creation.
|
||||
- Added: Shortcuts text for all the ease-of-use tricks you can do to speed up use of the program; access via the About window.
|
28
Resources/text/shortcuts.txt
Normal file
28
Resources/text/shortcuts.txt
Normal file
|
@ -0,0 +1,28 @@
|
|||
If you are having issues viewing gender symbols, Options -> Toggle Unicode Text.
|
||||
|
||||
|
||||
// Main Window
|
||||
|
||||
Control + Click on...
|
||||
Randomize IVs: Set all IVs to max.
|
||||
Randomize EVs: Set all EVs to 0.
|
||||
PP Ups Label: Set all PP Ups to 3.
|
||||
Friendship Label: Reset Friendship
|
||||
|
||||
Click on the Save File path (above Boxes): Auto-detect/Reload save.
|
||||
|
||||
Control-Drag a Box Slot to Copy-Overwrite
|
||||
Alt-Drag a Box Slot to Delete-Overwrite
|
||||
|
||||
Control-Shift-Click a slot to set a Pokemon to every slot in the box.
|
||||
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.
|
||||
|
||||
Control-Click the OpenTemp button to open the CyberGadget Cache folder.
|
||||
|
||||
|
||||
// Inventory Editor
|
||||
|
||||
Alt-Click loading a pouch will give all items with quantity x995. Disabled for Key Items and TMs.
|
||||
|
|
@ -30,7 +30,8 @@ namespace PKHeX
|
|||
popFavorite();
|
||||
|
||||
LB_Favorite.SelectedIndex = 0;
|
||||
MT_Flags.Text = BitConverter.ToUInt32(sav, 0x2942C).ToString();
|
||||
MT_Flags.Text = BitConverter.ToUInt16(sav, 0x24800 + 0x140).ToString();
|
||||
// MT_Flags.Text = BitConverter.ToUInt32(sav, 0x2942C).ToString();
|
||||
B_SAV2FAV(null, null);
|
||||
}
|
||||
Form1 m_parent;
|
||||
|
@ -349,7 +350,7 @@ namespace PKHeX
|
|||
private void B_Save_Click(object sender, EventArgs e)
|
||||
{
|
||||
uint flags = Util.ToUInt32(MT_Flags);
|
||||
Array.Copy(BitConverter.GetBytes(flags), 0, sav, 0x2942C, 4);
|
||||
Array.Copy(BitConverter.GetBytes(flags), 0, sav, 0x24800 + 0x140, 4);
|
||||
Array.Copy(sav, m_parent.savefile, 0x100000);
|
||||
m_parent.savedited = true;
|
||||
Close();
|
||||
|
|
Loading…
Reference in a new issue