Change gen1/2 encounter preference

Previous approach was 'most likely to find valid', this approach is a
little greedier to try to find a more fitting match. Will result in a
small increase in computation time, but trying out EncounterTrades and
static encounters first is preferred.

Fix Rhydon ingame trade gender. Bulbapedia is wrong, that's a Male
Rhydon with those IVs.
This commit is contained in:
Kurt 2017-06-12 21:05:04 -07:00
parent 8a4c40908b
commit 7b874757f7
3 changed files with 49 additions and 22 deletions

View file

@ -92,6 +92,10 @@ namespace PKHeX.Core
HashSet<int> species = new HashSet<int>(vs.Select(p => p.Species).ToList());
var deferred = new List<IEncounterable>();
foreach (var t in getValidEncounterTrade(pkm, game))
{
yield return new GBEncounterData(pkm, gen, t, game);
}
foreach (var s in getValidStaticEncounter(pkm, game))
{
// Valid stadium and non-stadium encounters, return only non-stadium encounters, they are less restrictive
@ -104,17 +108,12 @@ namespace PKHeX.Core
}
yield return new GBEncounterData(pkm, gen, s, game);
}
foreach (var e in getValidWildEncounters(pkm, game))
{
if (!species.Contains(e.Species))
continue;
yield return new GBEncounterData(pkm, gen, e, game);
}
foreach (var t in getValidEncounterTrade(pkm, game))
{
yield return new GBEncounterData(pkm, gen, t, game);
}
if (game == GameVersion.GSC)
{
@ -142,18 +141,46 @@ namespace PKHeX.Core
}
private static IEnumerable<GBEncounterData> GenerateFilteredEncounters(PKM pkm)
{
IEnumerable<GBEncounterData> filter(IEnumerable<GBEncounterData> data) => data
.OrderBy(z => !(z.Encounter is EncounterTrade && z.Generation == 2) || z.Type == GBEncounterType.EggEncounter)
.ThenBy(z => z.Species).ThenBy(z => z.Level);
bool crystal = pkm.Format == 2 && pkm.Met_Location != 0;
if (!pkm.Gen2_NotTradeback && !crystal)
foreach (var z in filter(GenerateRawEncounters12(pkm, GameVersion.RBY)))
yield return z;
var g1i = new PeekEnumerator<GBEncounterData>(get1().GetEnumerator());
var g2i = new PeekEnumerator<GBEncounterData>(get2().GetEnumerator());
var deferred = new List<GBEncounterData>();
while (g2i.PeekIsNext() || g1i.PeekIsNext())
{
PeekEnumerator<GBEncounterData> move;
if (g1i.PeekIsNext())
{
if (g2i.PeekIsNext())
move = g1i.Peek().Type > g2i.Peek().Type ? g1i : g2i;
else
move = g1i;
}
else
move = g2i;
if (!pkm.Gen1_NotTradeback && AllowGen2VCTransfer)
foreach (var z in filter(GenerateRawEncounters12(pkm, crystal ? GameVersion.C : GameVersion.GSC)))
yield return z;
var obj = move.Peek();
if (obj.Generation == 1 && obj.Encounter is EncounterTrade && !getEncounterTrade1Valid(pkm))
deferred.Add(obj);
else
yield return obj;
move.MoveNext();
}
foreach (var z in deferred)
yield return z;
IEnumerable<GBEncounterData> get1()
{
if (!pkm.Gen2_NotTradeback && !crystal)
foreach (var z in GenerateRawEncounters12(pkm, GameVersion.RBY))
yield return z;
}
IEnumerable<GBEncounterData> get2()
{
if (!pkm.Gen1_NotTradeback && AllowGen2VCTransfer)
foreach (var z in GenerateRawEncounters12(pkm, crystal ? GameVersion.C : GameVersion.GSC))
yield return z;
}
}
private static IEnumerable<IEncounterable> GenerateRawEncounters(PKM pkm)
{

View file

@ -4,12 +4,12 @@ namespace PKHeX.Core
{
public enum GBEncounterType
{
TradeEncounterG1 = 1,
StaticEncounter = 3,
WildEncounter = 2,
EggEncounter = 9,
TradeEncounterG2 = 10,
SpecialEncounter = 20,
EggEncounter,
WildEncounter,
StaticEncounter,
SpecialEncounter,
TradeEncounterG1,
TradeEncounterG2,
}
public class GBEncounterData : IEncounterable

View file

@ -125,7 +125,7 @@ namespace PKHeX.Core
new EncounterTrade { Species = 095, Generation = 2, Level = 03, Gender = 0, Location = 06, TID = 48926, IVs = new[] {08, 09, 06, 06, 06, 06} }, // Onix @ Violet City for Bellsprout [wild]
new EncounterTrade { Species = 066, Generation = 2, Level = 05, Gender = 1, Location = 16, TID = 37460, IVs = new[] {12, 03, 07, 06, 06, 06} }, // Machop @ Goldenrod City for Drowzee [wild 9, hatched egg 5]
new EncounterTrade { Species = 100, Generation = 2, Level = 05, Gender = 2, Location = 27, TID = 29189, IVs = new[] {08, 09, 08, 08, 08, 08} }, // Voltorb @ Olivine City for Krabby [egg]
new EncounterTrade { Species = 112, Generation = 2, Level = 30, Gender = 1, Location = 41, TID = 00283, IVs = new[] {12, 07, 07, 06, 06, 06} }, // Rhydon @ Blackthorn City for Dragonair [blue jp game corner]
new EncounterTrade { Species = 112, Generation = 2, Level = 30, Gender = 0, Location = 41, TID = 00283, IVs = new[] {12, 07, 07, 06, 06, 06} }, // Rhydon @ Blackthorn City for Dragonair [blue jp game corner]
new EncounterTrade { Species = 142, Generation = 2, Level = 05, Gender = 0, Location = 76, TID = 26491, IVs = new[] {08, 09, 06, 06, 06, 06} }, // Aerodactyl @ Route 14 for Chansey [egg]
new EncounterTrade { Species = 078, Generation = 2, Level = 14, Gender = 0, Location = 51, TID = 15616, IVs = new[] {08, 09, 06, 06, 06, 06} }, // Rapidash @ Pewter City for Gloom [wild]