PKHeX/PKHeX.Core/PKM/PB8.cs
Kurt 95fbf66a6e
Refactor: Gen3/4 Lead Encounters, property fixing (#4193)
In addition to the Method 1 (and other sibling PIDIV types) correlation, an encounter can only be triggered if the calls prior land on the Method {1} seed. The RNG community has dubbed these patterns as "Method J" (D/P/Pt), "Method K" (HG/SS), and "Method H" (Gen3, coined by yours truly). The basic gist of these is that they are pre-requisites, like the Shadow locks of Colosseum/XD. 

Rename/re-type a bunch of properties to get the codebase more in line with correct property names & more obvious underlying types.
2024-02-22 21:20:54 -06:00

132 lines
5 KiB
C#

using System;
namespace PKHeX.Core;
/// <summary> Generation 8 <see cref="PKM"/> format. </summary>
public sealed class PB8 : G8PKM
{
public override ReadOnlySpan<ushort> ExtraBytes =>
[
// Alignment bytes
0x17, 0x1A, 0x1B, 0x23, 0x33, 0x3E, 0x3F,
0x4C, 0x4D, 0x4E, 0x4F,
0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x91, 0x92, 0x93,
0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
0xC5,
0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB,
0xE0, 0xE1, // Old Console Region / Region
0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
0x115, 0x11F, // Alignment
0x13D, 0x13E, 0x13F,
0x140, 0x141, 0x142, 0x143, 0x144, 0x145, 0x146, 0x147,
];
public override PersonalInfo8BDSP PersonalInfo => PersonalTable.BDSP.GetFormEntry(Species, Form);
public override IPermitRecord Permit => PersonalInfo;
public override bool IsNative => BDSP;
public override EntityContext Context => EntityContext.Gen8b;
public PB8()
{
EggLocation = MetLocation = Locations.Default8bNone;
AffixedRibbon = -1; // 00 would make it show Kalos Champion :)
}
public PB8(byte[] data) : base(data) { }
public override PB8 Clone() => new((byte[])Data.Clone());
public bool IsDprIllegal
{
get => Data[0x52] != 0;
set => Data[0x52] = (byte)((Data[0x52] & 0xFE) | (value ? 1 : 0));
}
public void Trade(ITrainerInfo tr, int Day = 1, int Month = 1, int Year = 2015)
{
if (IsEgg)
{
// Apply link trade data, only if it left the OT (ignore if dumped & imported, or cloned, etc.)
if ((tr.TID16 != TID16) || (tr.SID16 != SID16) || (tr.Gender != OriginalTrainerGender) || (tr.OT != OriginalTrainerName))
SetLinkTradeEgg(Day, Month, Year, Locations.LinkTrade6NPC);
// Unfortunately, BD/SP doesn't return if it's an egg, and can update the HT details & handler.
// Continue to the rest of the method.
// return;
}
// Process to the HT if the OT of the Pokémon does not match the SAV's OT info.
if (!TradeOT(tr))
TradeHT(tr);
}
public void FixMemories()
{
if (BDSP)
{
OriginalTrainerMemoryVariable = OriginalTrainerMemory = OriginalTrainerMemoryIntensity = OriginalTrainerMemoryFeeling = 0;
HandlingTrainerMemoryVariable = HandlingTrainerMemory = HandlingTrainerMemoryIntensity = HandlingTrainerMemoryFeeling = 0; // future inter-format conversion?
}
if (IsEgg) // No memories if is egg.
{
HandlingTrainerMemoryVariable = HandlingTrainerMemory = HandlingTrainerMemoryIntensity = HandlingTrainerMemoryFeeling = 0;
OriginalTrainerMemoryVariable = OriginalTrainerMemory = OriginalTrainerMemoryIntensity = OriginalTrainerMemoryFeeling = 0;
// Clear Handler
if (!IsTradedEgg)
{
HandlingTrainerFriendship = HandlingTrainerGender = HandlingTrainerLanguage = 0;
HandlingTrainerTrash.Clear();
}
return;
}
if (IsUntraded)
HandlingTrainerMemoryVariable = HandlingTrainerGender = HandlingTrainerFriendship = HandlingTrainerMemory = HandlingTrainerMemoryIntensity = HandlingTrainerMemoryFeeling = HandlingTrainerLanguage = 0;
var gen = Generation;
if (gen < 6)
OriginalTrainerMemoryVariable = OriginalTrainerMemory = OriginalTrainerMemoryIntensity = OriginalTrainerMemoryFeeling = 0;
// if (gen != 8) // must be transferred via HOME, and must have memories
// this.SetTradeMemoryHT8(); // not faking HOME tracker.
}
private bool TradeOT(ITrainerInfo tr)
{
// Check to see if the OT matches the SAV's OT info.
if (!(tr.ID32 == ID32 && tr.Gender == OriginalTrainerGender && tr.OT == OriginalTrainerName))
return false;
CurrentHandler = 0;
return true;
}
private void TradeHT(ITrainerInfo tr)
{
if (HandlingTrainerName != tr.OT)
{
HandlingTrainerFriendship = PersonalInfo.BaseFriendship;
HandlingTrainerName = tr.OT;
}
CurrentHandler = 1;
HandlingTrainerGender = tr.Gender;
HandlingTrainerLanguage = (byte)tr.Language;
//this.SetTradeMemoryHT8();
}
// Maximums
public override ushort MaxMoveID => Legal.MaxMoveID_8b;
public override ushort MaxSpeciesID => Legal.MaxSpeciesID_8b;
public override int MaxAbilityID => Legal.MaxAbilityID_8b;
public override int MaxItemID => Legal.MaxItemID_8b;
public override int MaxBallID => Legal.MaxBallID_8b;
public override GameVersion MaxGameID => Legal.MaxGameID_HOME;
public override bool WasEgg => IsEgg || EggDay != 0;
public override bool HasOriginalMetLocation => base.HasOriginalMetLocation && !(LA && MetLocation == LocationsHOME.SWLA);
}