mirror of
https://github.com/kwsch/PKHeX
synced 2025-02-17 05:48:44 +00:00
rework dex getting
changes iteration to be per-species rather than per list. uses the internal 'should i set a bitflag' code rather than a banlist.
This commit is contained in:
parent
7895746bbe
commit
c4f8dabd26
3 changed files with 127 additions and 94 deletions
|
@ -1037,7 +1037,7 @@ namespace PKHeX.Core
|
|||
|
||||
int formstart = pkm.AltForm;
|
||||
int formend = pkm.AltForm;
|
||||
bool reset = SanitizeFormsToIterate(pkm.Species, out int fs, out int fe, formstart);
|
||||
bool reset = SanitizeFormsToIterate(pkm.Species, out int fs, out int fe, formstart, USUM);
|
||||
if (reset)
|
||||
{
|
||||
formstart = fs;
|
||||
|
@ -1092,57 +1092,58 @@ namespace PKHeX.Core
|
|||
|
||||
((PK7)pkm).FormDuration = duration;
|
||||
}
|
||||
private bool SanitizeFormsToIterate(int species, out int formStart, out int formEnd, int formIn)
|
||||
public static bool SanitizeFormsToIterate(int species, out int formStart, out int formEnd, int formIn, bool USUM)
|
||||
{
|
||||
// 004AA370 in Moon
|
||||
// Simplified in terms of usage -- only overrides to give all the battle forms for a pkm
|
||||
formStart = 0;
|
||||
formEnd = 0;
|
||||
switch (species)
|
||||
{
|
||||
case 351: // Castform
|
||||
case 778 when USUM: // Mimikyu
|
||||
formStart = 0;
|
||||
formEnd = 3;
|
||||
return true;
|
||||
|
||||
case 020: // Raticate
|
||||
case 105 when USUM: // Marowak
|
||||
case 105: // Marowak
|
||||
formStart = 0;
|
||||
formEnd = 2;
|
||||
formEnd = 1;
|
||||
return true;
|
||||
|
||||
case 735: // Gumshoos
|
||||
case 758: // Salazzle
|
||||
case 754: // Lurantis
|
||||
case 738: // Vikavolt
|
||||
case 784: // Kommo-o
|
||||
case 752: // Araquanid
|
||||
case 777: // Togedemaru
|
||||
case 743: // Ribombee
|
||||
case 744: // Rockruff
|
||||
break;
|
||||
|
||||
case 421: // Cherrim
|
||||
case 555: // Darmanitan
|
||||
case 648: // Meloetta
|
||||
case 746: // Wishiwashi
|
||||
case 778: // Mimikyu
|
||||
case 743 when USUM: // Ribombee
|
||||
case 744 when USUM: // Rockruff
|
||||
case 752 when USUM: // Araquanid
|
||||
case 777 when USUM: // Togedemaru
|
||||
formStart = 0;
|
||||
formEnd = 1;
|
||||
return true;
|
||||
|
||||
case 774: // Minior
|
||||
case 774 when formIn > 6: // Minior
|
||||
// Cores forms are after Meteor forms, so the game iterator would give all meteor forms (NO!)
|
||||
// So the game so the game chooses to only award entries for Core forms after they appear in battle.
|
||||
return formIn > 6; // resets to 0/0 if an invalid request is made (non-form entry)
|
||||
|
||||
case 718:
|
||||
if (formIn == 3) // complete
|
||||
return true; // 0/0
|
||||
if (formIn != 2) // give
|
||||
return false;
|
||||
break; // resets to 0/0 if an invalid request is made (non-form entry)
|
||||
|
||||
// Apparently form 2 is invalid (50% core-ability), set to 10%'s form
|
||||
formStart = 1;
|
||||
formEnd = 1;
|
||||
return true;
|
||||
case 718 when formIn > 1:
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
int count = USUM ? SaveUtil.GetDexFormCountUSUM(species) : SaveUtil.GetDexFormCountSM(species);
|
||||
formStart = formEnd = 0;
|
||||
return count < formIn;
|
||||
}
|
||||
formStart = 0;
|
||||
formEnd = 0;
|
||||
return true;
|
||||
}
|
||||
private void SetDexFlags(int index, int gender, int shiny, int baseSpecies)
|
||||
{
|
||||
|
|
|
@ -777,6 +777,13 @@ namespace PKHeX.Core
|
|||
return -1;
|
||||
return formindex;
|
||||
}
|
||||
private static int GetDexFormCount(int species, IReadOnlyList<ushort> formtable)
|
||||
{
|
||||
for (int i = 0; i < formtable.Count; i += 2)
|
||||
if (formtable[i] == species)
|
||||
return formtable[i + 1];
|
||||
return 0;
|
||||
}
|
||||
public static int GetDexFormIndexBW(int species, int formct)
|
||||
{
|
||||
if (formct < 1 || species < 0)
|
||||
|
@ -897,6 +904,8 @@ namespace PKHeX.Core
|
|||
}
|
||||
public static int GetDexFormIndexSM(int species, int formct, int start) => GetDexFormBitIndex(species, formct, start, formtable_SM);
|
||||
public static int GetDexFormIndexUSUM(int species, int formct, int start) => GetDexFormBitIndex(species, formct, start, formtable_USUM);
|
||||
public static int GetDexFormCountSM(int species) => GetDexFormCount(species, formtable_SM);
|
||||
public static int GetDexFormCountUSUM(int species) => GetDexFormCount(species, formtable_USUM);
|
||||
|
||||
public static int GetCXDVersionID(int gen3version)
|
||||
{
|
||||
|
|
|
@ -142,7 +142,7 @@ namespace PKHeX.WinForms
|
|||
var ds = PKX.GetFormList(bspecies, GameInfo.Strings.types, GameInfo.Strings.forms, Main.GenderSymbols, SAV.Generation).ToList();
|
||||
if (ds.Count == 1 && string.IsNullOrEmpty(ds[0]))
|
||||
{
|
||||
// empty (Alolan Totems)
|
||||
// empty
|
||||
LB_Forms.Enabled = false;
|
||||
return false;
|
||||
}
|
||||
|
@ -369,84 +369,45 @@ namespace PKHeX.WinForms
|
|||
{
|
||||
allModifying = true;
|
||||
LB_Forms.Enabled = LB_Forms.Visible = false;
|
||||
|
||||
bool USUM = SAV.USUM;
|
||||
int lang = SAV.Language;
|
||||
if (lang > 5) lang -= 1;
|
||||
lang -= 1;
|
||||
int[] totem = { 811, 1018, 1019, 1025, 1026, 1058, 1059, 1060 };
|
||||
// 1024 is used by Wishiwashi school form.
|
||||
|
||||
if (sender == mnuSeenNone || sender == mnuSeenAll || sender == mnuComplete)
|
||||
for (int i = 0; i < LB_Species.Items.Count; i++)
|
||||
{
|
||||
LB_Species.SelectedIndex = i;
|
||||
int gt = GetBaseSpeciesGender(LB_Species.SelectedIndex);
|
||||
foreach (CheckBox t in new[] { CHK_P2, CHK_P3, CHK_P4, CHK_P5 })
|
||||
t.Checked = mnuSeenNone != sender && t.Enabled;
|
||||
|
||||
if (mnuSeenNone != sender && !totem.Contains(i+1))
|
||||
{
|
||||
// ensure at least one Displayed except for formes
|
||||
if (i >= CB_Species.Items.Count)
|
||||
continue;
|
||||
if (!(CHK_P6.Checked || CHK_P7.Checked || CHK_P8.Checked || CHK_P9.Checked))
|
||||
(gt != 254 ? CHK_P6 : CHK_P7).Checked = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (CheckBox t in CP)
|
||||
t.Checked = false;
|
||||
}
|
||||
|
||||
if (!CHK_P1.Checked)
|
||||
foreach (CheckBox t in CL)
|
||||
t.Checked = false;
|
||||
}
|
||||
|
||||
if (sender == mnuCaughtNone || sender == mnuCaughtAll || sender == mnuComplete)
|
||||
for (int i = 0; i < SAV.MaxSpeciesID; i++)
|
||||
{
|
||||
for (int i = 0; i < LB_Species.Items.Count; i++)
|
||||
int spec = i + 1;
|
||||
var pi = SAV.Personal[spec];
|
||||
var gt = pi.Gender;
|
||||
var c = pi.FormeCount;
|
||||
|
||||
// Set base species flags
|
||||
LB_Species.SelectedIndex = i;
|
||||
SetSeen(sender, gt, false);
|
||||
SetCaught(sender, gt, lang, false);
|
||||
|
||||
// Set forme flags
|
||||
for (int j = 1; j < c; j++)
|
||||
{
|
||||
int gt = GetBaseSpeciesGender(LB_Species.SelectedIndex);
|
||||
LB_Species.SelectedIndex = i;
|
||||
foreach (CheckBox t in new[] { CHK_P1 })
|
||||
t.Checked = mnuCaughtNone != sender;
|
||||
for (int j = 0; j < CL.Length; j++)
|
||||
CL[j].Checked = CL[j].Enabled && (sender == mnuComplete || (mnuCaughtNone != sender && j == lang));
|
||||
|
||||
// Don't modify totem entries
|
||||
if (totem.Contains(i+1))
|
||||
continue;
|
||||
|
||||
if (mnuCaughtNone == sender)
|
||||
int start = j;
|
||||
int end = j;
|
||||
if (SAV7.SanitizeFormsToIterate(spec, out int s, out int n, j, USUM))
|
||||
{
|
||||
if (i >= CB_Species.Items.Count)
|
||||
start = s;
|
||||
end = n;
|
||||
}
|
||||
for (int f = start; f <= end; f++)
|
||||
{
|
||||
if (f == 0)
|
||||
continue; // already set
|
||||
int x = SAV.USUM ? SaveUtil.GetDexFormIndexUSUM(spec, c, f) : SaveUtil.GetDexFormIndexSM(spec, c, f);
|
||||
if (x < 0)
|
||||
continue;
|
||||
if (!(CHK_P2.Checked || CHK_P3.Checked || CHK_P4.Checked || CHK_P5.Checked)) // if seen
|
||||
if (!(CHK_P6.Checked || CHK_P7.Checked || CHK_P8.Checked || CHK_P9.Checked)) // not displayed
|
||||
(gt != 254 ? CHK_P6 : CHK_P7).Checked = true; // check one
|
||||
|
||||
continue;
|
||||
bool isForm = f != 0;
|
||||
LB_Species.SelectedIndex = SAV.MaxSpeciesID - 1 + x;
|
||||
SetSeen(sender, gt, isForm);
|
||||
SetCaught(sender, gt, lang, isForm);
|
||||
}
|
||||
|
||||
if (mnuComplete == sender)
|
||||
{
|
||||
// Seen All
|
||||
foreach (var chk in new[] { CHK_P2, CHK_P3, CHK_P4, CHK_P5 })
|
||||
chk.Checked = chk.Enabled;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ensure at least one SEEN
|
||||
if (!(CHK_P2.Checked || CHK_P3.Checked || CHK_P4.Checked || CHK_P5.Checked))
|
||||
(gt != 254 ? CHK_P2 : CHK_P3).Checked = true;
|
||||
}
|
||||
|
||||
// ensure at least one Displayed except for formes
|
||||
if (i >= CB_Species.Items.Count)
|
||||
continue;
|
||||
if (!(CHK_P6.Checked || CHK_P7.Checked || CHK_P8.Checked || CHK_P9.Checked))
|
||||
(gt != 254 ? CHK_P6 : CHK_P7).Checked = CHK_P1.Enabled;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -458,5 +419,67 @@ namespace PKHeX.WinForms
|
|||
LB_Forms.Enabled = LB_Forms.Visible = true;
|
||||
LB_Species.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
private void SetCaught(object sender, int gt, int lang, bool isForm)
|
||||
{
|
||||
foreach (CheckBox t in new[] {CHK_P1})
|
||||
t.Checked = mnuCaughtNone != sender;
|
||||
for (int j = 0; j < CL.Length; j++)
|
||||
CL[j].Checked = CL[j].Enabled && (sender == mnuComplete || (mnuCaughtNone != sender && j == lang));
|
||||
|
||||
if (mnuCaughtNone == sender)
|
||||
{
|
||||
if (isForm)
|
||||
return;
|
||||
if (!(CHK_P2.Checked || CHK_P3.Checked || CHK_P4.Checked || CHK_P5.Checked)) // if seen
|
||||
if (!(CHK_P6.Checked || CHK_P7.Checked || CHK_P8.Checked || CHK_P9.Checked)) // not displayed
|
||||
(gt != 254 ? CHK_P6 : CHK_P7).Checked = true; // check one
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (mnuComplete == sender)
|
||||
{
|
||||
// Seen All
|
||||
foreach (var chk in new[] {CHK_P2, CHK_P3, CHK_P4, CHK_P5})
|
||||
chk.Checked = chk.Enabled;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ensure at least one SEEN
|
||||
if (!(CHK_P2.Checked || CHK_P3.Checked || CHK_P4.Checked || CHK_P5.Checked))
|
||||
(gt != 254 ? CHK_P2 : CHK_P3).Checked = true;
|
||||
}
|
||||
|
||||
// ensure at least one Displayed except for formes
|
||||
if (isForm)
|
||||
return;
|
||||
if (!(CHK_P6.Checked || CHK_P7.Checked || CHK_P8.Checked || CHK_P9.Checked))
|
||||
(gt != 254 ? CHK_P6 : CHK_P7).Checked = CHK_P1.Enabled;
|
||||
}
|
||||
|
||||
private void SetSeen(object sender, int gt, bool isForm)
|
||||
{
|
||||
foreach (CheckBox t in new[] {CHK_P2, CHK_P3, CHK_P4, CHK_P5})
|
||||
t.Checked = mnuSeenNone != sender && t.Enabled;
|
||||
|
||||
if (mnuSeenNone != sender)
|
||||
{
|
||||
// ensure at least one Displayed except for formes
|
||||
if (isForm)
|
||||
return;
|
||||
if (!(CHK_P6.Checked || CHK_P7.Checked || CHK_P8.Checked || CHK_P9.Checked))
|
||||
(gt != 254 ? CHK_P6 : CHK_P7).Checked = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (CheckBox t in CP)
|
||||
t.Checked = false;
|
||||
}
|
||||
|
||||
if (!CHK_P1.Checked)
|
||||
foreach (CheckBox t in CL)
|
||||
t.Checked = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue