mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-22 10:23:09 +00:00
6441bdadd8
`Moveset` struct stores 4 moves, and exposes methods to interact with a moveset. `IndividualValueSet` stores a 6 IV template (signed). Performance impact: * Less allocating on the heap: Moves - (8 bytes member ptr, 20 bytes heap->8 bytes member) * Less allocating on the heap: IVs - (8 bytes member ptr, 28 bytes heap->8 bytes member) * No heap pointers, no need to jump to grab data. * Easy to inline logic for checking if moves are present (no linq usage with temporary collections). End result is faster ctor times, less memory used, faster program.
99 lines
2.9 KiB
C#
99 lines
2.9 KiB
C#
using static PKHeX.Core.Species;
|
|
|
|
namespace PKHeX.Core;
|
|
|
|
/// <summary>
|
|
/// Generation 2 Trade Encounter
|
|
/// </summary>
|
|
/// <inheritdoc cref="EncounterTradeGB"/>
|
|
public sealed record EncounterTrade2 : EncounterTradeGB
|
|
{
|
|
public override int Generation => 2;
|
|
public override EntityContext Context => EntityContext.Gen2;
|
|
public override int Location => Locations.LinkTrade2NPC;
|
|
|
|
public EncounterTrade2(ushort species, byte level, ushort tid) : base(species, level, GameVersion.GSC)
|
|
{
|
|
TID = tid;
|
|
}
|
|
|
|
public override bool IsMatchExact(PKM pk, EvoCriteria evo)
|
|
{
|
|
if (Level > pk.CurrentLevel) // minimum required level
|
|
return false;
|
|
if (TID != pk.TID)
|
|
return false;
|
|
|
|
if (pk.Format <= 2)
|
|
{
|
|
if (Gender >= 0 && Gender != pk.Gender)
|
|
return false;
|
|
if (IVs.IsSpecified && !Legal.GetIsFixedIVSequenceValidNoRand(IVs, pk))
|
|
return false;
|
|
if (pk.Format == 2 && pk.Met_Location is not (0 or 126))
|
|
return false;
|
|
}
|
|
|
|
if (!IsValidTradeOTGender(pk))
|
|
return false;
|
|
return IsValidTradeOTName(pk);
|
|
}
|
|
|
|
private bool IsValidTradeOTGender(PKM pk)
|
|
{
|
|
if (OTGender == 1)
|
|
{
|
|
// Female, can be cleared if traded to RBY (clears met location)
|
|
if (pk.Format <= 2)
|
|
return pk.OT_Gender == (pk.Met_Location != 0 ? 1 : 0);
|
|
return pk.OT_Gender == 0 || !pk.VC1; // require male except if transferred from GSC
|
|
}
|
|
return pk.OT_Gender == 0;
|
|
}
|
|
|
|
private bool IsValidTradeOTName(PKM pk)
|
|
{
|
|
var OT = pk.OT_Name;
|
|
if (pk.Japanese)
|
|
return GetOT((int)LanguageID.Japanese) == OT;
|
|
if (pk.Korean)
|
|
return GetOT((int)LanguageID.Korean) == OT;
|
|
|
|
var lang = GetInternationalLanguageID(OT);
|
|
if (pk.Format < 7)
|
|
return lang != -1;
|
|
|
|
switch (Species)
|
|
{
|
|
case (int)Voltorb when pk.Language == (int)LanguageID.French:
|
|
if (lang == (int)LanguageID.Spanish)
|
|
return false;
|
|
if (lang != -1)
|
|
return true;
|
|
return OT == "FALCçN"; // FALCÁN
|
|
|
|
case (int)Shuckle when pk.Language == (int)LanguageID.French:
|
|
if (lang == (int)LanguageID.Spanish)
|
|
return false;
|
|
if (lang != -1)
|
|
return true;
|
|
return OT == "MANôA"; // MANÍA
|
|
|
|
default: return lang != -1;
|
|
}
|
|
}
|
|
|
|
private int GetInternationalLanguageID(string OT)
|
|
{
|
|
const int start = (int)LanguageID.English;
|
|
const int end = (int)LanguageID.Spanish;
|
|
|
|
var tr = TrainerNames;
|
|
for (int i = start; i <= end; i++)
|
|
{
|
|
if (tr[i] == OT)
|
|
return i;
|
|
}
|
|
return -1;
|
|
}
|
|
}
|