PKHeX/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic3.cs
Kurt 5bcccc6d92
HOME 2.0.0: Handle conversion behavior & restrictions (#3506)
* Revises legality checks to account for traveling between the three game islands (PLA/BDSP/SWSH)
* Adds conversion mechanisms between the three formats, as well as flexible conversion options to backfill missing data (thanks GameFreak/ILCA for opting for lossy conversion instead of updating the games).
* Adds API abstractions for HOME data storage format (EKH/PKH format 1, aka EH1/PH1).
* Revises some APIs for better usage:
  - `PKM` now exposes a `Context` to indicate the isolation context for legality purposes.
  - Some method signatures have changed to accept `Context` or `GameVersion` instead of a vague `int` for Generation.
  - Evolution History is now tracked in the Legality parse for specific contexts, rather than only per generation.
2022-05-30 21:43:52 -07:00

85 lines
2.7 KiB
C#

using System;
using System.Linq;
namespace PKHeX.Core
{
/// <summary>
/// Generation 3 Static Encounter
/// </summary>
/// <inheritdoc cref="EncounterStatic"/>
public sealed record EncounterStatic3 : EncounterStatic
{
public override int Generation => 3;
public bool Roaming { get; init; }
public EncounterStatic3(ushort species, byte level, GameVersion game) : base(game)
{
Species = species;
Level = level;
}
protected override bool IsMatchEggLocation(PKM pkm)
{
if (pkm.Format == 3)
return !pkm.IsEgg || EggLocation == 0 || EggLocation == pkm.Met_Location;
return base.IsMatchEggLocation(pkm);
}
protected override bool IsMatchLevel(PKM pkm, EvoCriteria evo)
{
if (pkm.Format != 3) // Met Level lost on PK3=>PK4
return Level <= evo.LevelMax;
if (EggEncounter)
return pkm.Met_Level == 0 && pkm.CurrentLevel >= 5; // met level 0, origin level 5
return pkm.Met_Level == Level;
}
protected override bool IsMatchLocation(PKM pkm)
{
if (EggEncounter)
return true;
if (pkm.Format != 3)
return true; // transfer location verified later
var met = pkm.Met_Location;
if (!Roaming)
return Location == met;
var table = Version <= GameVersion.E ? Roaming_MetLocation_RSE : Roaming_MetLocation_FRLG;
return table.Contains(met);
}
protected override bool IsMatchPartial(PKM pkm)
{
if (Gift && pkm.Ball != Ball)
return true;
return base.IsMatchPartial(pkm);
}
protected override void SetMetData(PKM pk, int level, DateTime today)
{
pk.Met_Level = level;
pk.Met_Location = !Roaming ? Location : (Version <= GameVersion.E ? Roaming_MetLocation_RSE : Roaming_MetLocation_FRLG)[0];
}
private static readonly int[] Roaming_MetLocation_FRLG =
{
// Route 1-25 encounter is possible either in grass or on water
101,102,103,104,105,106,107,108,109,110,
111,112,113,114,115,116,117,118,119,120,
121,122,123,124,125,
};
private static readonly int[] Roaming_MetLocation_RSE =
{
// Roaming encounter is possible in tall grass and on water
// Route 101-138
16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49,
};
}
}