using System; namespace PKHeX.Core; /// /// Inter-format manipulation API for . /// /// public interface IGameDataSide : IGameDataSide where T : PKM, new() { /// /// Copies the data from the current instance into the input . /// /// Entity to copy to /// Overall HOME data object void CopyTo(T pk, PKH pkh); /// /// Copies the data from the input into the current instance. /// /// Entity to copy from /// Overall HOME data object void CopyFrom(T pk, PKH pkh); /// /// Converts the data to a . /// /// Overall HOME data object T ConvertToPKM(PKH pkh); /// /// Initializes the instance with data from the input . /// /// Other game data to initialize from /// Overall HOME data object void InitializeFrom(IGameDataSide other, PKH pkh); } /// /// Common properties stored by HOME's side game data formats. /// public interface IGameDataSide { ushort Move1 { get; set; } int Move1_PP { get; set; } int Move1_PPUps { get; set; } ushort RelearnMove1 { get; set; } ushort Move2 { get; set; } int Move2_PP { get; set; } int Move2_PPUps { get; set; } ushort RelearnMove2 { get; set; } ushort Move3 { get; set; } int Move3_PP { get; set; } int Move3_PPUps { get; set; } ushort RelearnMove3 { get; set; } ushort Move4 { get; set; } int Move4_PP { get; set; } int Move4_PPUps { get; set; } ushort RelearnMove4 { get; set; } int Ball { get; set; } int Met_Location { get; set; } int Egg_Location { get; set; } /// /// Gets the personal info for the input arguments. /// PersonalInfo GetPersonalInfo(ushort species, byte form); } public static class GameDataSideExtensions { /// /// Copies the shared properties into a destination. /// /// Source side game data /// Destination entity public static void CopyTo(this IGameDataSide data, PKM pk) { pk.Move1 = data.Move1; pk.Move1_PP = data.Move1_PP; pk.Move1_PPUps = data.Move1_PPUps; pk.RelearnMove1 = data.RelearnMove1; pk.Move2 = data.Move2; pk.Move2_PP = data.Move2_PP; pk.Move2_PPUps = data.Move2_PPUps; pk.RelearnMove2 = data.RelearnMove2; pk.Move3 = data.Move3; pk.Move3_PP = data.Move3_PP; pk.Move3_PPUps = data.Move3_PPUps; pk.RelearnMove3 = data.RelearnMove3; pk.Move4 = data.Move4; pk.Move4_PP = data.Move4_PP; pk.Move4_PPUps = data.Move4_PPUps; pk.RelearnMove4 = data.RelearnMove4; pk.Ball = data.Ball; pk.Met_Location = data.Met_Location; pk.Egg_Location = data.Egg_Location; } /// /// Copies the shared properties into a destination. /// /// Source side game data /// Destination entity public static void CopyTo(this IGameDataSide data, IGameDataSide pk) { pk.Move1 = data.Move1; pk.Move1_PP = data.Move1_PP; pk.Move1_PPUps = data.Move1_PPUps; pk.RelearnMove1 = data.RelearnMove1; pk.Move2 = data.Move2; pk.Move2_PP = data.Move2_PP; pk.Move2_PPUps = data.Move2_PPUps; pk.RelearnMove2 = data.RelearnMove2; pk.Move3 = data.Move3; pk.Move3_PP = data.Move3_PP; pk.Move3_PPUps = data.Move3_PPUps; pk.RelearnMove3 = data.RelearnMove3; pk.Move4 = data.Move4; pk.Move4_PP = data.Move4_PP; pk.Move4_PPUps = data.Move4_PPUps; pk.RelearnMove4 = data.RelearnMove4; pk.Ball = data.Ball; pk.Met_Location = data.Met_Location; pk.Egg_Location = data.Egg_Location; } /// /// Copies the shared properties into a destination. /// /// Source side game data /// Destination entity public static void CopyFrom(this IGameDataSide data, PKM pk) { data.Move1 = pk.Move1; data.Move1_PP = pk.Move1_PP; data.Move1_PPUps = pk.Move1_PPUps; data.RelearnMove1 = pk.RelearnMove1; data.Move2 = pk.Move2; data.Move2_PP = pk.Move2_PP; data.Move2_PPUps = pk.Move2_PPUps; data.RelearnMove2 = pk.RelearnMove2; data.Move3 = pk.Move3; data.Move3_PP = pk.Move3_PP; data.Move3_PPUps = pk.Move3_PPUps; data.RelearnMove3 = pk.RelearnMove3; data.Move4 = pk.Move4; data.Move4_PP = pk.Move4_PP; data.Move4_PPUps = pk.Move4_PPUps; data.RelearnMove4 = pk.RelearnMove4; data.Ball = pk.Ball; data.Met_Location = pk.Met_Location; data.Egg_Location = pk.Egg_Location; } /// /// Resets the moves using the for the given level. /// public static void ResetMoves(this IGameDataSide data, ushort species, byte form, int level, ILearnSource source, EntityContext context) { var learn = source.GetLearnset(species, form); Span moves = stackalloc ushort[4]; learn.SetEncounterMoves(level, moves); data.Move1 = moves[0]; data.Move2 = moves[1]; data.Move3 = moves[2]; data.Move4 = moves[3]; data.Move1_PP = MoveInfo.GetPP(context, moves[0]); data.Move2_PP = MoveInfo.GetPP(context, moves[1]); data.Move3_PP = MoveInfo.GetPP(context, moves[2]); data.Move4_PP = MoveInfo.GetPP(context, moves[3]); } }