Bias rby encounter selection due to lack of info

Previously, if encounterstatic was valid it'd treat it as the actual
encounter.
Now, select the lowest species possible.

Only really affects moon stone evolution families, which are available
in the wild at lower levels than their coin counterpart (so we prefer
them).
Kinda flawed as DV spread can be checked (invalid=>use static) but this
should be good enough for now.
This commit is contained in:
Kurt 2017-02-12 21:02:24 -08:00
parent ff0a179c42
commit b89c1d7b6c
3 changed files with 69 additions and 45 deletions

View file

@ -519,6 +519,38 @@ namespace PKHeX.Core
} }
return null; return null;
} }
private CheckResult verifyEncounterG1()
{
// Since encounter matching is super weak due to limited stored data in the structure
// Calculate all 3 at the same time and pick the best result (by species).
var s = Legal.getValidStaticEncounter(pkm);
var e = Legal.getValidWildEncounters(pkm);
var t = Legal.getValidIngameTrade(pkm);
const byte invalid = 255;
var sm = s?.Species ?? invalid;
var em = e?.Min(slot => slot.Species) ?? invalid;
var tm = t?.Species ?? invalid;
if (sm + em + tm == 3*invalid)
return new CheckResult(Severity.Invalid, "Unknown encounter.", CheckIdentifier.Encounter);
if (em <= sm && em <= tm)
{
EncounterMatch = e;
return verifyEncounterWild();
}
if (sm <= em && sm <= tm)
{
EncounterMatch = s;
return verifyEncounterStatic();
}
// else is trade
return new CheckResult(Severity.Valid, "Valid ingame trade.", CheckIdentifier.Encounter);
}
private CheckResult verifyEncounter() private CheckResult verifyEncounter()
{ {
if (pkm.VC || pkm.Format < 3) if (pkm.VC || pkm.Format < 3)
@ -531,16 +563,12 @@ namespace PKHeX.Core
if (pkm.Format > 2) // transported to 7+ if (pkm.Format > 2) // transported to 7+
Parse.Add(verifyVCEncounter(baseSpecies)); Parse.Add(verifyVCEncounter(baseSpecies));
}
else if (pkm.GenNumber == 4)
{
return verifyEncounterG1();
} }
else
{
if (pkm.WasLink) if (pkm.WasLink)
return verifyEncounterLink(); return verifyEncounterLink();
}
if (pkm.WasEvent || pkm.WasEventEgg) if (pkm.WasEvent || pkm.WasEventEgg)
{ {

View file

@ -1045,7 +1045,7 @@ namespace PKHeX.Core
PersonalInfo pi = PersonalTable.RBY[species]; PersonalInfo pi = PersonalTable.RBY[species];
if (LVL) if (LVL)
{ {
r.AddRange(((PersonalInfoG1)PersonalTable.RBY[species]).Moves); r.AddRange(((PersonalInfoG1)pi).Moves);
r.AddRange(LevelUpRB[species].getMoves(lvl)); r.AddRange(LevelUpRB[species].getMoves(lvl));
} }
if (Machine) r.AddRange(TMHM_RBY.Where((t, m) => pi.TMHM[m])); if (Machine) r.AddRange(TMHM_RBY.Where((t, m) => pi.TMHM[m]));

View file

@ -50,37 +50,33 @@ namespace PKHeX.Core
new EncounterStatic { Species = 007, Level = 05 }, // Squirtle new EncounterStatic { Species = 007, Level = 05 }, // Squirtle
new EncounterStatic { Species = 025, Level = 05 }, // Pikachu new EncounterStatic { Species = 025, Level = 05 }, // Pikachu
// Red Game Corner // Game Corner
new EncounterStatic { Species = 063, Level = 09 }, // Abra new EncounterStatic { Species = 030, Level = 17 }, // Nidorina (Red Game Corner)
new EncounterStatic { Species = 025, Level = 08 }, // Clefairy new EncounterStatic { Species = 033, Level = 17 }, // Nidorino (Blue[EN] / Green[JP] Game Corner)
new EncounterStatic { Species = 025, Level = 17 }, // Nidorina new EncounterStatic { Species = 035, Level = 08 }, // Clefairy (Red Game Corner)
new EncounterStatic { Species = 147, Level = 18 }, // Dratini new EncounterStatic { Species = 036, Level = 24 }, // Clefable (Blue[JP] Game Corner)
new EncounterStatic { Species = 123, Level = 25 }, // Scyther new EncounterStatic { Species = 037, Level = 18 }, // Vulpix (Yellow Game Corner)
new EncounterStatic { Species = 137, Level = 26 }, // Porygon new EncounterStatic { Species = 040, Level = 22 }, // Wigglytuff (Yellow Game Corner)
new EncounterStatic { Species = 063, Level = 06 }, // Abra (Blue[EN] / Green[JP] Game Corner)
new EncounterStatic { Species = 116, Level = 18 }, // Horsea (Blue[JP] Game Corner)
new EncounterStatic { Species = 123, Level = 25 }, // Scyther (Red Game Corner)
new EncounterStatic { Species = 127, Level = 20 }, // Pinsir (Blue[EN] / Green[JP] Game Corner)
new EncounterStatic { Species = 137, Level = 18 }, // Porygon (Blue[EN] / Green[JP] Game Corner)
new EncounterStatic { Species = 147, Level = 18 }, // Dratini (Red Game Corner)
new EncounterStatic { Species = 148, Level = 30 }, // Dragonair (Blue[JP] Game Corner)
// Blue(EN) / Green(JP) Game Corner // Lower level less ideal matches; best match is from above.
new EncounterStatic { Species = 063, Level = 06 }, // Abra // new EncounterStatic { Species = 025, Level = 12 }, // Pikachu (Blue[JP] Game Corner)
new EncounterStatic { Species = 035, Level = 12 }, // Clefairy // new EncounterStatic { Species = 035, Level = 12 }, // Clefairy (Blue[EN] / Green[JP] Game Corner)
new EncounterStatic { Species = 030, Level = 17 }, // Nidorina // new EncounterStatic { Species = 063, Level = 09 }, // Abra (Red Game Corner)
new EncounterStatic { Species = 127, Level = 20 }, // Pinsir // new EncounterStatic { Species = 063, Level = 08 }, // Abra (Blue[JP] Game Corner)
new EncounterStatic { Species = 147, Level = 24 }, // Dratini // new EncounterStatic { Species = 063, Level = 15 }, // Abra (Yellow Game Corner)
new EncounterStatic { Species = 137, Level = 18 }, // Porygon // new EncounterStatic { Species = 123, Level = 30 }, // Scyther (Yellow Game Corner)
// new EncounterStatic { Species = 127, Level = 30 }, // Pinsir (Yellow Game Corner)
// Blue(JP) Game Corner // new EncounterStatic { Species = 137, Level = 22 }, // Porygon (Blue[JP] Game Corner)
new EncounterStatic { Species = 063, Level = 08 }, // Abra // new EncounterStatic { Species = 137, Level = 26 }, // Porygon (Red Game Corner)
new EncounterStatic { Species = 025, Level = 12 }, // Pikachu // new EncounterStatic { Species = 137, Level = 26 }, // Porygon (Yellow Game Corner)
new EncounterStatic { Species = 116, Level = 18 }, // Horsea // new EncounterStatic { Species = 147, Level = 24 }, // Dratini (Blue[EN] / Green[JP] Game Corner)
new EncounterStatic { Species = 036, Level = 24 }, // Clefable
new EncounterStatic { Species = 148, Level = 30 }, // Dragonair
new EncounterStatic { Species = 137, Level = 22 }, // Porygon
// Yellow Game Corner
new EncounterStatic { Species = 063, Level = 15 }, // Abra
new EncounterStatic { Species = 025, Level = 18 }, // Vulpix
new EncounterStatic { Species = 025, Level = 22 }, // Wigglytuff
new EncounterStatic { Species = 123, Level = 30 }, // Scyther
new EncounterStatic { Species = 127, Level = 30 }, // Pinsir
new EncounterStatic { Species = 137, Level = 26 }, // Porygon
new EncounterStatic { Species = 129, Level = 05 }, // Magikarp new EncounterStatic { Species = 129, Level = 05 }, // Magikarp
new EncounterStatic { Species = 143, Level = 30 }, // Snorlax new EncounterStatic { Species = 143, Level = 30 }, // Snorlax
@ -101,11 +97,11 @@ namespace PKHeX.Core
new EncounterStatic { Species = 133, Level = 25 }, // Eevee new EncounterStatic { Species = 133, Level = 25 }, // Eevee
// Yellow Only // Yellow Only -- duplicate encounters with a higher level
new EncounterStatic { Species = 133, Level = 25 }, // Eevee (Celadon City) // new EncounterStatic { Species = 133, Level = 25 }, // Eevee (Celadon City)
new EncounterStatic { Species = 001, Level = 10 }, // Bulbasaur (Cerulean City) // new EncounterStatic { Species = 001, Level = 10 }, // Bulbasaur (Cerulean City)
new EncounterStatic { Species = 004, Level = 10 }, // Charmander (Route 24) // new EncounterStatic { Species = 004, Level = 10 }, // Charmander (Route 24)
new EncounterStatic { Species = 007, Level = 10 }, // Squirtle (Vermillion City) // new EncounterStatic { Species = 007, Level = 10 }, // Squirtle (Vermillion City)
}; };
internal static readonly EncounterTrade[] TradeGift_RBY = internal static readonly EncounterTrade[] TradeGift_RBY =
{ {