Consolidate encounterlink into mysterygift

use synthetic wondercards to match link gifts
This commit is contained in:
Kurt 2019-01-12 23:50:31 -08:00
parent ce11bda416
commit 41a3989b53
14 changed files with 16 additions and 216 deletions

View file

@ -254,10 +254,11 @@ namespace PKHeX.Core
public static int[] GetSuggestedRelearnMoves(this PKM pk, LegalityAnalysis legal) public static int[] GetSuggestedRelearnMoves(this PKM pk, LegalityAnalysis legal)
{ {
int[] m = legal.GetSuggestedRelearn(); int[] m = legal.GetSuggestedRelearn();
if (!m.All(z => z == 0)) if (m.Any(z => z != 0))
return m; return m;
if (pk.WasEgg || pk.WasEvent || pk.WasEventEgg || pk.WasLink) var enc = legal.EncounterMatch;
if (enc is MysteryGift || enc is EncounterEgg)
return m; return m;
var encounter = legal.GetSuggestedMetInfo(); var encounter = legal.GetSuggestedMetInfo();

View file

@ -401,23 +401,5 @@ namespace PKHeX.Core
new EncounterTrade { Species = 222, Level = 50, Ability = 4, Gender = 1, TID = 00325, Nature = Nature.Calm, IVs = new[] {31, -1, -1, -1, -1, 31}, }, // Corsola new EncounterTrade { Species = 222, Level = 50, Ability = 4, Gender = 1, TID = 00325, Nature = Nature.Calm, IVs = new[] {31, -1, -1, -1, -1, 31}, }, // Corsola
}; };
#endregion #endregion
#region Pokémon Link Gifts
internal static readonly EncounterLink[] LinkGifts6 =
{
new EncounterLink { Species = 154, Level = 50, Ability = 4, Moves = new[] {076, 241, 235, 034} }, // Meganium
new EncounterLink { Species = 157, Level = 50, Ability = 4, Moves = new[] {315, 172, 488, 129} }, // Typhlosion
new EncounterLink { Species = 160, Level = 50, Ability = 4, Moves = new[] {008, 242, 127, 103} }, // Feraligatr with Ice Punch (not relearn)
new EncounterLink { Species = 251, Level = 10, Ability = 1, Moves = new[] {105, 215, 610, 219}, RelearnMoves = new[] {610, 0, 0, 0}, Ball = 11, Version = GameVersion.XY }, // Celebi
new EncounterLink { Species = 377, Level = 50, Ability = 4, Moves = new[] {153, 008, 444, 359}, RelearnMoves = new[] {153, 008, 444, 359}, }, // Regirock
new EncounterLink { Species = 378, Level = 50, Ability = 4, Moves = new[] {085, 133, 058, 258}, RelearnMoves = new[] {085, 133, 058, 258}, }, // Regice
new EncounterLink { Species = 379, Level = 50, Ability = 4, Moves = new[] {442, 157, 356, 334}, RelearnMoves = new[] {442, 157, 356, 334}, }, // Registeel
new EncounterLink { Species = 208, Level = 40, Ability = 1, Moves = new[] {231, 242, 157, 103}, RibbonClassic = false, Version = GameVersion.ORAS, OT = false }, // Steelix
new EncounterLink { Species = 362, Level = 40, Ability = 1, Moves = new[] {423, 029, 182, 524}, RibbonClassic = false, Version = GameVersion.ORAS, OT = false }, // Glalie
};
#endregion
} }
} }

View file

@ -1,97 +0,0 @@
using System;
namespace PKHeX.Core
{
/// <summary>
/// Pokémon Link Encounter Data
/// </summary>
public sealed class EncounterLink : IEncounterable, IRibbonSetEvent4, IMoveset, ILocation, IVersion
{
public int Species { get; set; }
public int Level { get; set; }
public int LevelMin => Level;
public int LevelMax => Level;
public int Location { get; set; } = 30011;
public int Ability { get; set; } = 1;
public int Ball { get; set; } = 4; // Pokéball
public int[] RelearnMoves { get; set; } = Array.Empty<int>();
public bool OT { get; set; } = true; // Receiver is OT?
public bool EggEncounter => false;
public int EggLocation { get => 0; set { } }
public GameVersion Version { get; set; } = GameVersion.Gen6;
public int[] Moves { get; set; } = Array.Empty<int>();
public string Name => "Pokémon Link Gift";
public bool RibbonClassic { get; set; } = true;
// Unused
public bool RibbonWishing { get; set; }
public bool RibbonPremier { get; set; }
public bool RibbonEvent { get; set; }
public bool RibbonBirthday { get; set; }
public bool RibbonSpecial { get; set; }
public bool RibbonWorld { get; set; }
public bool RibbonChampionWorld { get; set; }
public bool RibbonSouvenir { get; set; }
public PKM ConvertToPKM(ITrainerInfo SAV) => ConvertToPKM(SAV, EncounterCriteria.Unrestricted);
public PKM ConvertToPKM(ITrainerInfo SAV, EncounterCriteria criteria)
{
const int gen = 6;
var version = this.GetCompatibleVersion((GameVersion)SAV.Game);
int lang = (int)Legal.GetSafeLanguage(6, (LanguageID)SAV.Language);
var pk = new PK6
{
EncryptionConstant = Util.Rand32(),
Species = Species,
Language = lang,
CurrentLevel = Level,
Version = (int)version,
PID = Util.Rand32(),
Nickname = PKX.GetSpeciesNameGeneration(Species, lang, gen),
Ball = Ball,
};
SAV.ApplyToPKM(pk);
SetMetData(pk);
SetNatureGender(pk, criteria);
pk.RefreshAbility(Ability >> 1);
pk.SetRandomIVs(flawless: 3);
pk.Version = (int)version;
pk.Language = lang;
pk.Moves = Moves;
pk.SetMaximumPPCurrent(Moves);
pk.OT_Friendship = pk.PersonalInfo.BaseFriendship;
if (RelearnMoves.Length > 0)
pk.RelearnMoves = RelearnMoves;
if (RibbonClassic)
pk.RibbonClassic = true;
pk.SetRandomMemory6();
if (!OT)
SAV.ApplyHandlingTrainerInfo(pk);
return pk;
}
private static void SetNatureGender(PKM pk, EncounterCriteria criteria)
{
pk.Nature = (int)criteria.GetNature(Nature.Random);
pk.Gender = criteria.GetGender(-1, pk.PersonalInfo);
}
private void SetMetData(PKM pk)
{
pk.MetDate = DateTime.Today;
pk.Met_Level = Level;
pk.Met_Location = Location;
}
}
}

View file

@ -7,7 +7,6 @@ using static PKHeX.Core.MysteryGiftGenerator;
using static PKHeX.Core.EncounterTradeGenerator; using static PKHeX.Core.EncounterTradeGenerator;
using static PKHeX.Core.EncounterSlotGenerator; using static PKHeX.Core.EncounterSlotGenerator;
using static PKHeX.Core.EncounterStaticGenerator; using static PKHeX.Core.EncounterStaticGenerator;
using static PKHeX.Core.EncounterLinkGenerator;
using static PKHeX.Core.EncounterEggGenerator; using static PKHeX.Core.EncounterEggGenerator;
namespace PKHeX.Core namespace PKHeX.Core
@ -305,14 +304,8 @@ namespace PKHeX.Core
private static IEnumerable<IEncounterable> GenerateRawEncounters(PKM pkm) private static IEnumerable<IEncounterable> GenerateRawEncounters(PKM pkm)
{ {
int ctr = 0; int ctr = 0;
if (pkm.WasLink)
{
foreach (var z in GetValidLinkGifts(pkm))
{ yield return z; ++ctr; }
if (ctr != 0) yield break;
}
if (pkm.WasEvent || pkm.WasEventEgg) if (pkm.WasEvent || pkm.WasEventEgg || pkm.WasLink)
{ {
foreach (var z in GetValidGifts(pkm)) foreach (var z in GetValidGifts(pkm))
{ yield return z; ++ctr; } { yield return z; ++ctr; }

View file

@ -1,27 +0,0 @@
using System.Collections.Generic;
using System.Linq;
namespace PKHeX.Core
{
public static class EncounterLinkGenerator
{
public static IEnumerable<EncounterLink> GetPossible(PKM pkm)
{
if (!pkm.Gen6)
return Enumerable.Empty<EncounterLink>();
return Encounters6.LinkGifts6.Where(g => g.Species == pkm.Species);
}
public static IEnumerable<EncounterLink> GetPossible(PKM pkm, IReadOnlyList<DexLevel> vs)
{
if (!pkm.Gen6)
return Enumerable.Empty<EncounterLink>();
return Encounters6.LinkGifts6.Where(g => vs.Any(z => z.Species == g.Species));
}
public static IEnumerable<EncounterLink> GetValidLinkGifts(PKM pkm)
{
return GetPossible(pkm).Where(g => g.Level == pkm.Met_Level);
}
}
}

View file

@ -133,7 +133,6 @@ namespace PKHeX.Core
{ {
case EncounterOrder.Egg: return GetEggs(pk, needs, version); case EncounterOrder.Egg: return GetEggs(pk, needs, version);
case EncounterOrder.Mystery: return GetGifts(pk, needs); case EncounterOrder.Mystery: return GetGifts(pk, needs);
case EncounterOrder.Link: return GetLink(pk, needs);
case EncounterOrder.Static: return GetStatic(pk, needs); case EncounterOrder.Static: return GetStatic(pk, needs);
case EncounterOrder.Trade: return GetTrades(pk, needs); case EncounterOrder.Trade: return GetTrades(pk, needs);
case EncounterOrder.Slot: return GetSlots(pk, needs); case EncounterOrder.Slot: return GetSlots(pk, needs);
@ -195,28 +194,6 @@ namespace PKHeX.Core
} }
} }
/// <summary>
/// Gets possible encounters that allow all moves requested to be learned.
/// </summary>
/// <param name="pk">Rough Pokémon data which contains the requested species, gender, and form.</param>
/// <param name="needs">Moves which cannot be taught by the player.</param>
/// <returns>A consumable <see cref="IEncounterable"/> list of possible encounters.</returns>
private static IEnumerable<EncounterLink> GetLink(PKM pk, IReadOnlyCollection<int> needs)
{
var gifts = EncounterLinkGenerator.GetPossible(pk);
foreach (var gift in gifts)
{
if (needs.Count == 0)
{
yield return gift;
continue;
}
var em = gift.Moves;
if (!needs.Except(em).Any())
yield return gift;
}
}
/// <summary> /// <summary>
/// Gets possible encounters that allow all moves requested to be learned. /// Gets possible encounters that allow all moves requested to be learned.
/// </summary> /// </summary>

View file

@ -4,7 +4,6 @@ namespace PKHeX.Core
{ {
Egg, Egg,
Mystery, Mystery,
Link,
Static, Static,
Trade, Trade,
Slot, Slot,

View file

@ -29,7 +29,6 @@ namespace PKHeX.Core
switch (info.EncounterMatch) switch (info.EncounterMatch)
{ {
case EncounterEgg _: return VerifyEncounterEgg(pkm); case EncounterEgg _: return VerifyEncounterEgg(pkm);
case EncounterLink l: return VerifyEncounterLink(pkm, l);
case EncounterTrade t: return VerifyEncounterTrade(pkm, t); case EncounterTrade t: return VerifyEncounterTrade(pkm, t);
case EncounterSlot w: return VerifyEncounterWild(pkm, w); case EncounterSlot w: return VerifyEncounterWild(pkm, w);
case EncounterStatic s: return VerifyEncounterStatic(pkm, s); case EncounterStatic s: return VerifyEncounterStatic(pkm, s);
@ -342,25 +341,6 @@ namespace PKHeX.Core
return new CheckResult(Severity.Valid, LEncTradeMatch, CheckIdentifier.Encounter); return new CheckResult(Severity.Valid, LEncTradeMatch, CheckIdentifier.Encounter);
} }
private static CheckResult VerifyEncounterLink(PKM pkm, EncounterLink enc)
{
// Should NOT be Fateful, and should be in Database
if (enc == null)
return new CheckResult(Severity.Invalid, LLinkNone, CheckIdentifier.Encounter);
if (pkm.XY && !enc.CanBeReceivedBy(GameVersion.XY))
return new CheckResult(Severity.Invalid, LLinkXY, CheckIdentifier.Encounter);
if (pkm.AO && !enc.CanBeReceivedBy(GameVersion.ORAS))
return new CheckResult(Severity.Invalid, LLinkAO, CheckIdentifier.Encounter);
if (pkm.IsShiny)
return new CheckResult(Severity.Invalid, LLinkShiny, CheckIdentifier.Encounter);
return pkm.FatefulEncounter
? new CheckResult(Severity.Invalid, LLinkFateful, CheckIdentifier.Encounter)
: new CheckResult(Severity.Valid, LLinkValid, CheckIdentifier.Encounter);
}
private static CheckResult VerifyEncounterEvent(PKM pkm, MysteryGift MatchedGift) private static CheckResult VerifyEncounterEvent(PKM pkm, MysteryGift MatchedGift)
{ {
switch (MatchedGift) switch (MatchedGift)

View file

@ -20,8 +20,6 @@ namespace PKHeX.Core
switch (info.EncounterMatch) switch (info.EncounterMatch)
{ {
case EncounterLink l when l.RelearnMoves.Length > 0:
return VerifyRelearnSpecifiedMoveset(pkm, info, l.RelearnMoves);
case MysteryGift g: case MysteryGift g:
return VerifyRelearnSpecifiedMoveset(pkm, info, g.RelearnMoves); return VerifyRelearnSpecifiedMoveset(pkm, info, g.RelearnMoves);
case EncounterStatic s when s.Relearn.Length > 0: case EncounterStatic s when s.Relearn.Length > 0:

View file

@ -335,7 +335,6 @@ namespace PKHeX.Core
{ {
case EncounterStatic s: return s.Ability; case EncounterStatic s: return s.Ability;
case EncounterTrade t: return t.Ability; case EncounterTrade t: return t.Ability;
case EncounterLink l: return l.Ability;
default: return -1; default: return -1;
} }
} }

View file

@ -30,8 +30,6 @@ namespace PKHeX.Core
{ {
case MysteryGift g: case MysteryGift g:
return VerifyBallMysteryGift(data, g); return VerifyBallMysteryGift(data, g);
case EncounterLink l:
return VerifyBallEquals(data, l.Ball);
case EncounterTrade t: case EncounterTrade t:
return VerifyBallEquals(data, t.Ball); return VerifyBallEquals(data, t.Ball);
case EncounterStatic s when s.Gift: case EncounterStatic s when s.Gift:

View file

@ -270,10 +270,10 @@ namespace PKHeX.Core
break; break;
} }
return; return;
case WC6 g when !g.IsEgg: case WC6 g when !g.IsEgg && g.OTGender != 3:
VerifyOTMemoryIs(data, g.OT_Memory, g.OT_Intensity, g.OT_TextVar, g.OT_Feeling); VerifyOTMemoryIs(data, g.OT_Memory, g.OT_Intensity, g.OT_TextVar, g.OT_Feeling);
return; return;
case WC7 g when !g.IsEgg: case WC7 g when !g.IsEgg && g.OTGender != 3:
VerifyOTMemoryIs(data, g.OT_Memory, g.OT_Intensity, g.OT_TextVar, g.OT_Feeling); VerifyOTMemoryIs(data, g.OT_Memory, g.OT_Intensity, g.OT_TextVar, g.OT_Feeling);
return; return;
} }
@ -387,15 +387,10 @@ namespace PKHeX.Core
{ {
if (generation < 6) if (generation < 6)
return false; return false;
if (EncounterMatch is EncounterLink link && !link.OT)
return false;
bool untraded = pkm.HT_Name.Length == 0 || (pkm is IGeoTrack g && g.Geo1_Country == 0); bool untraded = pkm.HT_Name.Length == 0 || (pkm is IGeoTrack g && g.Geo1_Country == 0);
if (!(EncounterMatch is MysteryGift gift)) if (EncounterMatch is WC6 gift)
return untraded; return gift.OTGender == 3 && untraded;
untraded |= !pkm.WasEventEgg;
untraded &= gift.IsEgg;
return untraded; return untraded;
} }

View file

@ -209,7 +209,7 @@ namespace PKHeX.Core
data.AddLine(GetInvalid(LPIDTypeMismatch, CheckIdentifier.PID)); data.AddLine(GetInvalid(LPIDTypeMismatch, CheckIdentifier.PID));
} }
var result = pkm.FatefulEncounter var result = pkm.FatefulEncounter != pkm.WasLink
? GetValid(LFatefulMystery, CheckIdentifier.Fateful) ? GetValid(LFatefulMystery, CheckIdentifier.Fateful)
: GetInvalid(LFatefulMysteryMissing, CheckIdentifier.Fateful); : GetInvalid(LFatefulMysteryMissing, CheckIdentifier.Fateful);
data.AddLine(result); data.AddLine(result);

View file

@ -352,7 +352,7 @@ namespace PKHeX.Core
OT_Memory = OT_Memory, OT_Memory = OT_Memory,
OT_TextVar = OT_TextVar, OT_TextVar = OT_TextVar,
OT_Feeling = OT_Feeling, OT_Feeling = OT_Feeling,
FatefulEncounter = true, FatefulEncounter = MetLocation != 30011, // Link gifts do not set fateful encounter
EVs = EVs, EVs = EVs,
}; };
@ -457,10 +457,12 @@ namespace PKHeX.Core
{ {
if (pkm.Egg_Location == 0) // Not Egg if (pkm.Egg_Location == 0) // Not Egg
{ {
if (CardID != pkm.SID) return false; if (OTGender != 3)
if (TID != pkm.TID) return false; {
if (OT_Name != pkm.OT_Name) return false; if (SID != pkm.SID) return false;
if (OTGender != pkm.OT_Gender) return false; if (TID != pkm.TID) return false;
if (OTGender != pkm.OT_Gender) return false;
}
if (PIDType == Shiny.FixedValue && pkm.PID != PID) return false; if (PIDType == Shiny.FixedValue && pkm.PID != PID) return false;
if (!PIDType.IsValid(pkm)) return false; if (!PIDType.IsValid(pkm)) return false;
if (OriginGame != 0 && OriginGame != pkm.Version) return false; if (OriginGame != 0 && OriginGame != pkm.Version) return false;