diff --git a/PKHeX.Core/Editing/CommonEdits.cs b/PKHeX.Core/Editing/CommonEdits.cs index a24cbbb86..2942038cd 100644 --- a/PKHeX.Core/Editing/CommonEdits.cs +++ b/PKHeX.Core/Editing/CommonEdits.cs @@ -26,8 +26,8 @@ public static void SetNickname(this PKM pk, string nick = null) { pk.IsNicknamed = false; pk.Nickname = PKX.GetSpeciesNameGeneration(pk.Species, pk.Language, pk.Format); - if (pk is PK1 pk1) pk1.SetNotNicknamed(); - if (pk is PK2 pk2) pk2.SetNotNicknamed(); + if (pk is _K12 pk12) + pk12.SetNotNicknamed(); } } @@ -516,8 +516,7 @@ public static int GetMaximumEV(this PKM pk, int index) EVs[index] = 0; var sum = EVs.Sum(); int remaining = 510 - sum; - var newEV = Math.Min(Math.Max(remaining, 0), 252); - return newEV; + return Math.Min(Math.Max(remaining, 0), 252); } /// diff --git a/PKHeX.Core/Legality/Verifiers/Ball.cs b/PKHeX.Core/Game/Ball.cs similarity index 100% rename from PKHeX.Core/Legality/Verifiers/Ball.cs rename to PKHeX.Core/Game/Ball.cs diff --git a/PKHeX.Core/Legality/Structures/MoveType.cs b/PKHeX.Core/Game/MoveType.cs similarity index 100% rename from PKHeX.Core/Legality/Structures/MoveType.cs rename to PKHeX.Core/Game/MoveType.cs diff --git a/PKHeX.Core/Legality/Structures/Nature.cs b/PKHeX.Core/Game/Nature.cs similarity index 100% rename from PKHeX.Core/Legality/Structures/Nature.cs rename to PKHeX.Core/Game/Nature.cs diff --git a/PKHeX.Core/Legality/Areas/EncounterArea.cs b/PKHeX.Core/Legality/Areas/EncounterArea.cs index dd2e24639..42c62310f 100644 --- a/PKHeX.Core/Legality/Areas/EncounterArea.cs +++ b/PKHeX.Core/Legality/Areas/EncounterArea.cs @@ -72,6 +72,7 @@ private static IEnumerable GetSlots1_GW(byte[] data, ref int ofs int rate = data[ofs++]; return rate == 0 ? Enumerable.Empty() : ReadSlots(data, ref ofs, 10, t, rate); } + private static EncounterSlot1[] GetSlots1_F(byte[] data, ref int ofs) { int count = data[ofs++]; @@ -96,7 +97,7 @@ private static EncounterSlot1[] GetSlots2_GW(byte[] data, ref int ofs, SlotType { for (int i = 0; i < slotCount; i++) { - int index = i + r*slotCount; + int index = i + (r * slotCount); slots[index].Rate = rates[r]; slots[index].SlotNumber = i; slots[index].Time = r == 1 ? EncounterTime.Day : EncounterTime.Night; @@ -131,6 +132,7 @@ private static List GetSlots2_F(byte[] data, ref int ofs, SlotTy while (rate != 0xFF); return slots; } + private static EncounterSlot1[] GetSlots2_H(byte[] data, ref int ofs, SlotType t) { // slot set ends in 0xFF @@ -182,6 +184,7 @@ private static IEnumerable GetAreas2(byte[] data, ref int ofs, Sl ofs++; return areas; } + private static List GetAreas2_F(byte[] data, ref int ofs) { var areas = new List(); @@ -226,6 +229,7 @@ private static List GetAreas2_F(byte[] data, ref int ofs) } return areas; } + private static IEnumerable GetAreas2_H(byte[] data, ref int ofs) { // Read Location Table @@ -287,23 +291,25 @@ private static IEnumerable GetSlots3(byte[] data, ref int ofs, in { for (int i = 0; i < numslots; i++) { - int Species = BitConverter.ToInt16(data, ofs + 4 + i * 4); + int o = ofs + (i * 4); + int Species = BitConverter.ToInt16(data, o + 4); if (Species <= 0) continue; slots.Add(new EncounterSlot { - LevelMin = data[ofs + 2 + i * 4], - LevelMax = data[ofs + 3 + i * 4], + LevelMin = data[o + 2], + LevelMax = data[o + 3], Species = Species, SlotNumber = i, Type = t }); } } - ofs += 2 + numslots * 4; + ofs += 2 + (numslots * 4); return slots; } + private static IEnumerable GetSlots3_F(byte[] data, ref int ofs, int numslots) { var slots = new List(); @@ -313,14 +319,14 @@ private static IEnumerable GetSlots3_F(byte[] data, ref int ofs, { for (int i = 0; i < numslots; i++) { - int Species = BitConverter.ToInt16(data, ofs + 4 + i * 4); + int Species = BitConverter.ToInt16(data, ofs + 4 + (i * 4)); if (Species <= 0) continue; var slot = new EncounterSlot { - LevelMin = data[ofs + 2 + i*4], - LevelMax = data[ofs + 3 + i*4], + LevelMin = data[ofs + 2 + (i * 4)], + LevelMax = data[ofs + 3 + (i * 4)], Species = Species, }; if (i < 2) @@ -341,7 +347,7 @@ private static IEnumerable GetSlots3_F(byte[] data, ref int ofs, slots.Add(slot); } } - ofs += 2 + numslots * 4; + ofs += 2 + (numslots * 4); return slots; } @@ -351,8 +357,9 @@ private static EncounterSlot[] GetSlots4_DPPt_G(byte[] data, int ofs, int numslo for (int i = 0; i < numslots; i++) { - int level = data[ofs + i*8]; - int species = BitConverter.ToInt32(data, ofs + i*8 + 4); + int o = ofs + (i * 8); + int level = data[o]; + int species = BitConverter.ToInt32(data, o + 4); slots[i] = new EncounterSlot { LevelMax = level, @@ -364,6 +371,7 @@ private static EncounterSlot[] GetSlots4_DPPt_G(byte[] data, int ofs, int numslo } return slots; } + private static EncounterSlot[] GetSlots4_HGSS_G(byte[] data, int ofs, int numslots, SlotType t) { var slots = new EncounterSlot[numslots * 3]; @@ -372,7 +380,7 @@ private static EncounterSlot[] GetSlots4_HGSS_G(byte[] data, int ofs, int numslo for (int i = 0; i < numslots; i++) { int level = data[ofs + i]; - int species = BitConverter.ToUInt16(data, ofs + numslots + i * 2); + int species = BitConverter.ToUInt16(data, ofs + numslots + (i * 2)); slots[i] = new EncounterSlot { LevelMin = level, @@ -382,15 +390,16 @@ private static EncounterSlot[] GetSlots4_HGSS_G(byte[] data, int ofs, int numslo Type = t }; slots[numslots + i] = slots[i].Clone(); - slots[numslots + i].Species = BitConverter.ToUInt16(data, ofs + numslots * 3 + i * 2); + slots[numslots + i].Species = BitConverter.ToUInt16(data, ofs + (numslots * 3) + (i * 2)); slots[numslots + i].Type = t; - slots[numslots * 2 + i] = slots[i].Clone(); - slots[numslots * 2 + i].Species = BitConverter.ToUInt16(data, ofs + numslots * 5 + i * 2); - slots[numslots * 2 + i].Type = t; + slots[(numslots * 2) + i] = slots[i].Clone(); + slots[(numslots * 2) + i].Species = BitConverter.ToUInt16(data, ofs + (numslots * 5) + (i * 2)); + slots[(numslots * 2) + i].Type = t; } return slots; } + private static List GetSlots4_G_Replace(byte[] data, int ofs, int slotSize, EncounterSlot[] ReplacedSlots, int[] slotnums, SlotType t = SlotType.Grass) { //Special slots like GBA Dual Slot. Those slot only contain the info of species id, the level is copied from one of the first grass slots @@ -404,7 +413,7 @@ private static List GetSlots4_G_Replace(byte[] data, int ofs, int if (baseSlot.LevelMin <= 0) continue; - int species = BitConverter.ToUInt16(data, ofs + i / (4 / slotSize) * slotSize); + int species = BitConverter.ToUInt16(data, ofs + (i / (4 / slotSize) * slotSize)); if (species <= 0 || baseSlot.Species == species) // Empty or duplicate continue; @@ -416,21 +425,22 @@ private static List GetSlots4_G_Replace(byte[] data, int ofs, int } return slots; } + private static IEnumerable GetSlots4DPPt_WFR(byte[] data, int ofs, int numslots, SlotType t) { var slots = new List(); for (int i = 0; i < numslots; i++) { // max, min, unused, unused, [32bit species] - int Species = BitConverter.ToInt32(data, ofs + 4 + i * 8); + int Species = BitConverter.ToInt32(data, ofs + 4 + (i * 8)); if (Species <= 0) continue; // fishing and surf slots with species = 0 are not added // DPPt does not have fishing or surf swarms slots.Add(new EncounterSlot { - LevelMax = data[ofs + 0 + i * 8], - LevelMin = data[ofs + 1 + i * 8], + LevelMax = data[ofs + 0 + (i * 8)], + LevelMin = data[ofs + 1 + (i * 8)], Species = Species, SlotNumber = i, Type = t @@ -439,13 +449,14 @@ private static IEnumerable GetSlots4DPPt_WFR(byte[] data, int ofs EncounterUtil.MarkEncountersStaticMagnetPull(slots, PersonalTable.HGSS); return slots; } + private static IEnumerable GetSlots4HGSS_WFR(byte[] data, int ofs, int numslots, SlotType t) { var slots = new List(); for (int i = 0; i < numslots; i++) { // min, max, [16bit species] - int Species = BitConverter.ToInt16(data, ofs + 2 + i * 4); + int Species = BitConverter.ToInt16(data, ofs + 2 + (i * 4)); if (t == SlotType.Rock_Smash && Species <= 0) continue; // fishing and surf slots with species = 0 are added too, it is needed for the swarm encounters, @@ -453,8 +464,8 @@ private static IEnumerable GetSlots4HGSS_WFR(byte[] data, int ofs slots.Add(new EncounterSlot { - LevelMin = data[ofs + 0 + i * 4], - LevelMax = data[ofs + 1 + i * 4], + LevelMin = data[ofs + 0 + (i * 4)], + LevelMax = data[ofs + 1 + (i * 4)], Species = Species, SlotNumber = i, Type = t @@ -563,8 +574,10 @@ private static EncounterArea GetArea4DPPt(byte[] data, bool pt = false) // get all permutations of trophy inhabitants var trophy = regular[0].Concat(slots).ToArray(); for (int i = 0; i < trophy.Length; i++) - for (int j = i + 1; j < trophy.Length; j++) - regular.Add(new List{trophy[i], trophy[j]}); + { + for (int j = i + 1; j < trophy.Length; j++) + regular.Add(new List{trophy[i], trophy[j]}); + } } var set = new[] { regular, pair0, pair1, pair2, pair3 }; @@ -601,6 +614,7 @@ private static EncounterArea GetArea4DPPt(byte[] data, bool pt = false) return Area4; } + private static IEnumerable MarkStaticMagnetExtras(IEnumerable>> product) { var trackPermute = new List(); @@ -608,6 +622,7 @@ private static IEnumerable MarkStaticMagnetExtras(IEnumerable z), trackPermute); return trackPermute; } + private static void MarkStaticMagnetPermute(IEnumerable grp, List trackPermute) { EncounterUtil.MarkEncountersStaticMagnetPullPermutation(grp, PersonalTable.HGSS, trackPermute); @@ -688,6 +703,7 @@ private static EncounterArea GetArea4HGSS(byte[] data) slot.Area = Area4; return Area4; } + private static readonly EncounterSlot[] SlotsHGSS_Staryu = { new EncounterSlot { Species = 120, LevelMin = 20, LevelMax = 20, Type = SlotType.Good_Rod }, @@ -707,14 +723,14 @@ private static EncounterArea GetArea4HGSS_Headbutt(byte[] data) // 12-17 Special trees for (int i = 0; i < 18; i++) { - int Species = BitConverter.ToInt16(data, 6 + i*4); + int Species = BitConverter.ToInt16(data, 6 + (i * 4)); if (Species <= 0) continue; Slots.Add(new EncounterSlot { Species = Species, - LevelMin = data[8 + i*4], - LevelMax = data[9 + i*4], + LevelMin = data[8 + (i * 4)], + LevelMax = data[9 + (i * 4)], Type = i <= 11 ? SlotType.Headbutt : SlotType.Headbutt_Special }); } @@ -818,6 +834,7 @@ public static EncounterArea[] GetArray1_GW(byte[] data) } return areas.Where(area => area.Slots.Length != 0).ToArray(); } + /// /// Gets the encounter areas with information from Pokémon Yellow (Generation 1) Fishing data. /// @@ -830,15 +847,16 @@ public static EncounterArea[] GetArray1_FY(byte[] data) EncounterArea[] areas = new EncounterArea[count]; for (int i = 0; i < count; i++) { - int ofs = i*size + 1; + int ofs = (i * size) + 1; areas[i] = new EncounterArea { - Location = data[i*size + 0], + Location = data[(i * size) + 0], Slots = ReadSlots_FY(data, ref ofs, 4, SlotType.Super_Rod, -1) }; } return areas; } + /// /// Gets the encounter areas with information from Generation 1 Fishing data. /// @@ -851,13 +869,13 @@ public static EncounterArea[] GetArray1_F(byte[] data) int count = 0; for (int i = 0; i < ptr.Length; i++) { - map[i] = data[i*3 + 0]; + map[i] = data[(i * 3) + 0]; if (map[i] == 0xFF) { count = i; break; } - ptr[i] = BitConverter.ToInt16(data, i * 3 + 1); + ptr[i] = BitConverter.ToInt16(data, (i * 3) + 1); } EncounterArea[] areas = new EncounterArea[count]; @@ -927,6 +945,7 @@ public static EncounterArea[] GetArray2_F(byte[] data) areas.Add(new EncounterArea { Location = 0x2E, Slots = f[3].Slots }); // Silver Cave (2: Inside, 3: Outside) return areas.ToArray(); } + public static EncounterArea[] GetArray2_H(byte[] data) { int ofs = 0; diff --git a/PKHeX.Core/Legality/Areas/TreesArea.cs b/PKHeX.Core/Legality/Areas/TreesArea.cs index e4a8f65b7..7d172ca1c 100644 --- a/PKHeX.Core/Legality/Areas/TreesArea.cs +++ b/PKHeX.Core/Legality/Areas/TreesArea.cs @@ -10,18 +10,20 @@ public enum TreeEncounterAvailable { /// Encounter is possible a reachable tree ValidTree, + /// Encounter is only possible a tree reachable only with walk-through walls cheats InvalidTree, + /// Encounter is not possible in any tree Impossible } /// Coordinate / Index Relationship for a Headbutt Tree - internal class TreeCoordinates + internal sealed class TreeCoordinates { internal int X { get; } internal int Y { get; } - internal int Index => (X*Y + X+Y) / 5 % 10; + internal int Index => ((X*Y) + X+Y) / 5 % 10; public TreeCoordinates(int x, int y) { @@ -31,10 +33,11 @@ public TreeCoordinates(int x, int y) } /// Trees on a given map - public class TreesArea + public sealed class TreesArea { private const int PivotCount = 10; - private static int[][] TrainerModerateTreeIndex { get; } = GenerateTrainersTreeIndex(); + private static readonly int[][] TrainerModerateTreeIndex = GenerateTrainersTreeIndex(); + private static int[][] GenerateTrainersTreeIndex() { // A tree have a low encounter or moderate encounter base on the TID Pivot Index (TID % 10) @@ -49,13 +52,10 @@ private static int[][] GenerateTrainersTreeIndex() } return TrainersIndex; } + internal static TreesArea[] GetArray(byte[][] entries) => entries.Select(z => new TreesArea(z)).ToArray(); public int Location { get; private set; } - public TreeEncounterAvailable[] GetTrees(SlotType t) => t == SlotType.Headbutt - ? TrainerModerateEncounterTree - : TrainerLowEncounterTree; - private TreeEncounterAvailable[] TrainerModerateEncounterTree { get; set; } private TreeEncounterAvailable[] TrainerLowEncounterTree { get; set; } private int[] ValidTreeIndex { get; set; } @@ -63,6 +63,10 @@ private static int[][] GenerateTrainersTreeIndex() private TreeCoordinates[] ValidTrees { get; set; } private TreeCoordinates[] InvalidTrees { get; set; } + public TreeEncounterAvailable[] GetTrees(SlotType t) => t == SlotType.Headbutt + ? TrainerModerateEncounterTree + : TrainerLowEncounterTree; + private TreesArea(byte[] entry) { ReadAreaRawData(entry); @@ -116,6 +120,7 @@ private TreeEncounterAvailable GetAvailableModerate(int[] moderate) return TreeEncounterAvailable.InvalidTree; return TreeEncounterAvailable.Impossible; } + private TreeEncounterAvailable GetAvailableLow(int[] moderate) { if (ValidTreeIndex.Except(moderate).Any()) diff --git a/PKHeX.Core/Legality/Structures/ILocation.cs b/PKHeX.Core/Legality/Structures/ILocation.cs index 682b492c2..47e62fa39 100644 --- a/PKHeX.Core/Legality/Structures/ILocation.cs +++ b/PKHeX.Core/Legality/Structures/ILocation.cs @@ -23,7 +23,7 @@ internal static string GetEncounterLocation(this ILocation Encounter, int gen, i if (loc < 0) return null; - if (version == 15) // handle C/XD locations + if (version == (int)GameVersion.CXD) // handle C/XD locations { var locs = GameInfo.Strings.metCXD_00000; return loc >= locs.Length ? null : locs[loc]; diff --git a/PKHeX.Core/Legality/VivillonTables.cs b/PKHeX.Core/Legality/VivillonTables.cs index cf9e77b02..49a1d6e92 100644 --- a/PKHeX.Core/Legality/VivillonTables.cs +++ b/PKHeX.Core/Legality/VivillonTables.cs @@ -259,7 +259,7 @@ public static bool CheckVivillonPattern(int form, int country, int region) if (!VivillonCountryTable[form].Contains(country)) return false; // Country mismatch - CountryTable ct = Array.Find(RegionFormTable, t => t.countryID == country); + var ct = Array.Find(RegionFormTable, t => t.countryID == country); if (ct.otherforms == null) // empty struct = no forms referenced return true; // No subregion table @@ -317,6 +317,6 @@ public static bool IsConsoleRegionCountryValid(int consoleRegion, int country) } private static readonly HashSet ExtendedAmericas = new HashSet {153, 156, 168, 174, 186}; - private static readonly HashSet ExtendedEurope = new HashSet { 153, 156, 168, 174, 186 }; + private static readonly HashSet ExtendedEurope = new HashSet {169, 184, 185}; } } \ No newline at end of file