diff --git a/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs b/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs index a8618d84a..e3c69bcec 100644 --- a/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs +++ b/PKHeX.Core/Legality/Encounters/Data/Encounters4.cs @@ -307,18 +307,26 @@ private static EncounterType GetHeadbuttEncounterType(int Location) var allowsurf = HGSS_SurfingHeadbutt_Locations.Contains(Location); // Cities if (HGSS_CityLocations.Contains(Location)) - return allowsurf ? EncounterType.Headbutt_CitySurf : EncounterType.Building_EnigmaStone; + return allowsurf + ? EncounterType.Building_EnigmaStone | EncounterType.Surfing_Fishing + : EncounterType.Building_EnigmaStone; // Caves with no exterior zones if (!HGSS_MixInteriorExteriorLocations.Contains(Location) && HGSS_CaveLocations.Contains(Location)) - return allowsurf ? EncounterType.Headbutt_CaveSurf : EncounterType.Cave_HallOfOrigin; + return allowsurf + ? EncounterType.Cave_HallOfOrigin | EncounterType.Surfing_Fishing + : EncounterType.Cave_HallOfOrigin; // Routes and exterior areas // Routes with trees adjacent to grass tiles var allowgrass = HGSS_GrassHeadbutt_Locations.Contains(Location); - return allowgrass && allowsurf ? EncounterType.Headbutt_GrassSurf : - allowgrass ? EncounterType.Headbutt_Grass : - allowsurf ? EncounterType.Headbutt_Surf : - EncounterType.None; + if (allowgrass) + return allowsurf + ? EncounterType.TallGrass | EncounterType.Surfing_Fishing + : EncounterType.TallGrass; + + return allowsurf + ? EncounterType.Surfing_Fishing + : EncounterType.None; } private static void MarkHGSSEncounterTypeSlots(ref EncounterArea[] Areas) diff --git a/PKHeX.Core/Legality/Structures/EncounterType.cs b/PKHeX.Core/Legality/Structures/EncounterType.cs index 1235970fa..53a4c4964 100644 --- a/PKHeX.Core/Legality/Structures/EncounterType.cs +++ b/PKHeX.Core/Legality/Structures/EncounterType.cs @@ -1,4 +1,6 @@ -namespace PKHeX.Core +using System; + +namespace PKHeX.Core { /// /// Tile type the was encountered from. @@ -6,51 +8,29 @@ /// /// Used in Generation 4 games, this value is set depending on what type of overworld tile the player is standing on when the is obtained. /// Some locations have multiple tile types, requiring multiple values possible. - /// May be worthwhile to convert this and associated to bitflags for supporting 3+ tile types (or the ability to not be specific for combinations permitted). /// + [Flags] public enum EncounterType { - Headbutt_Grass = -1, // None or TallGrass - Headbutt_Surf = -2, // None or Surfing_Fishing - Headbutt_GrassSurf = -3, // None, TallGrass or Surfing_Fishing - Headbutt_CitySurf = -4, // Building_EnigmaStone or Surfing_Fishing - Headbutt_CaveSurf = -5, // Cave_HallOfOrigin or Surfing_Fishing - None = 0, - RockSmash = 1, - TallGrass = 2, - DialgaPalkia = 4, - Cave_HallOfOrigin = 5, - Surfing_Fishing = 7, - Building_EnigmaStone = 9, - MarshSafari = 10, - Starter_Fossil_Gift_DP = 12, - DistortionWorld_Pt = 23, - Starter_Fossil_Gift_Pt_DPTrio = 24, + None = 1 << 00, + RockSmash = 1 << 01, + TallGrass = 1 << 02, + DialgaPalkia = 1 << 04, + Cave_HallOfOrigin = 1 << 05, + Surfing_Fishing = 1 << 07, + Building_EnigmaStone = 1 << 09, + MarshSafari = 1 << 10, + Starter_Fossil_Gift_DP = 1 << 12, + DistortionWorld_Pt = 1 << 23, + Starter_Fossil_Gift_Pt_DPTrio = 1 << 24, } public static class EncounterTypeExtension { public static bool Contains(this EncounterType g1, int g2) { - return g1.Contains((EncounterType)g2); - } - private static bool Contains(this EncounterType g1, EncounterType g2) - { - switch (g1) - { - case EncounterType.Headbutt_Grass: - return g2 == EncounterType.None || g2 == EncounterType.TallGrass; - case EncounterType.Headbutt_Surf: - return g2 == EncounterType.None || g2 == EncounterType.Surfing_Fishing; - case EncounterType.Headbutt_GrassSurf: - return EncounterType.Headbutt_Grass.Contains(g2) || g2 == EncounterType.Surfing_Fishing; - case EncounterType.Headbutt_CitySurf: - return g2 == EncounterType.Building_EnigmaStone || g2 == EncounterType.Surfing_Fishing; - case EncounterType.Headbutt_CaveSurf: - return g2 == EncounterType.Cave_HallOfOrigin || g2 == EncounterType.Surfing_Fishing; - } - - return g1 == g2; + var type = (EncounterType)(1 << g2); + return (g1 & type) != 0; } } }