Esempio n. 1
0
        public EncounterArea4DPPt[] Clone(int[] locations)
        {
            var Areas = new EncounterArea4DPPt[locations.Length];

            for (int i = 0; i < locations.Length; i++)
            {
                Areas[i] = Clone(locations[i]);
            }
            return(Areas);
        }
Esempio n. 2
0
        private static IEnumerable <EncounterArea4DPPt> GetArea4DPPt(byte[] data, bool pt = false)
        {
            int location  = BitConverter.ToUInt16(data, 0x00);
            var GrassRate = BitConverter.ToInt32(data, 0x02);

            if (GrassRate > 0)
            {
                var Slots      = new List <EncounterSlot>();
                var GrassSlots = GetSlots4GrassDPPt(data, 0x06, 12);
                //Swarming slots replace slots 0 and 1
                var swarm = GetSlots4GrassSlotReplace(data, 0x66, 4, GrassSlots, Legal.Slot4_Swarm);
                //Morning and Night slots replace slots 2 and 3
                var morning = GetSlots4GrassSlotReplace(data, 0x6E, 4, GrassSlots, Legal.Slot4_Time); // Morning
                var night   = GetSlots4GrassSlotReplace(data, 0x76, 4, GrassSlots, Legal.Slot4_Time); // Night
                //Pokéradar slots replace slots 4,5,10 and 11
                //Pokéradar is marked with different slot type because it have different PID-IV generationn
                var radar = GetSlots4GrassSlotReplace(data, 0x7E, 4, GrassSlots, Legal.Slot4_Radar);

                //24 bytes padding

                //Dual Slots replace slots 8 and 9
                var ruby      = GetSlots4GrassSlotReplace(data, 0xA6, 4, GrassSlots, Legal.Slot4_Dual); // Ruby
                var sapphire  = GetSlots4GrassSlotReplace(data, 0xAE, 4, GrassSlots, Legal.Slot4_Dual); // Sapphire
                var emerald   = GetSlots4GrassSlotReplace(data, 0xB6, 4, GrassSlots, Legal.Slot4_Dual); // Emerald
                var firered   = GetSlots4GrassSlotReplace(data, 0xBE, 4, GrassSlots, Legal.Slot4_Dual); // FireRed
                var leafgreen = GetSlots4GrassSlotReplace(data, 0xC6, 4, GrassSlots, Legal.Slot4_Dual); // LeafGreen

                Slots.AddRange(GrassSlots);
                Slots.AddRange(swarm);
                Slots.AddRange(morning);
                Slots.AddRange(night);
                Slots.AddRange(radar);
                Slots.AddRange(ruby);
                Slots.AddRange(sapphire);
                Slots.AddRange(emerald);
                Slots.AddRange(firered);
                Slots.AddRange(leafgreen);

                // Permute Static-Magnet Pull combinations
                // [None/Swarm]-[None/Morning/Night]-[None/Radar]-[None/R/S/E/F/L] [None/TrophyGarden]
                // 2 * 3 * 2 * 6 = 72 different combinations of slots (more with trophy garden)
                var regular = new List <List <EncounterSlot4> > {
                    GrassSlots.Where(z => z.SlotNumber == 6 || z.SlotNumber == 7).ToList()
                };                                                                                                                       // every other slot is in the product
                var pair0 = new List <List <EncounterSlot4> > {
                    GrassSlots.Where(z => Legal.Slot4_Swarm.Contains(z.SlotNumber)).ToList()
                };
                var pair1 = new List <List <EncounterSlot4> > {
                    GrassSlots.Where(z => Legal.Slot4_Time.Contains(z.SlotNumber)).ToList()
                };
                var pair2 = new List <List <EncounterSlot4> > {
                    GrassSlots.Where(z => Legal.Slot4_Radar.Contains(z.SlotNumber)).ToList()
                };
                var pair3 = new List <List <EncounterSlot4> > {
                    GrassSlots.Where(z => Legal.Slot4_Dual.Contains(z.SlotNumber)).ToList()
                };

                if (swarm.Count != 0)
                {
                    pair0.Add(swarm);
                }
                if (morning.Count != 0)
                {
                    pair1.Add(morning);
                }
                if (night.Count != 0)
                {
                    pair1.Add(night);
                }
                if (radar.Count != 0)
                {
                    pair2.Add(radar);
                }

                if (ruby.Count != 0)
                {
                    pair3.Add(ruby);
                }
                if (sapphire.Count != 0)
                {
                    pair3.Add(sapphire);
                }
                if (emerald.Count != 0)
                {
                    pair3.Add(emerald);
                }
                if (firered.Count != 0)
                {
                    pair3.Add(firered);
                }
                if (leafgreen.Count != 0)
                {
                    pair3.Add(leafgreen);
                }

                if (location == 68) // Trophy Garden
                {
                    // Occupy Slots 6 & 7
                    var species     = pt ? Encounters4.TrophyPt : Encounters4.TrophyDP;
                    var trophySlots = new List <EncounterSlot4>();
                    foreach (var s in species)
                    {
                        var slot = (EncounterSlot4)regular[0][0].Clone();
                        slot.Species = s;
                        trophySlots.Add(slot);

                        slot         = (EncounterSlot4)regular[0][1].Clone();
                        slot.Species = s;
                        trophySlots.Add(slot);
                    }
                    Slots.AddRange(trophySlots);
                    // get all permutations of trophy inhabitants
                    var trophy = regular[0].Concat(trophySlots).ToArray();
                    for (int i = 0; i < trophy.Length; i++)
                    {
                        for (int j = i + 1; j < trophy.Length; j++)
                        {
                            regular.Add(new List <EncounterSlot4> {
                                trophy[i], trophy[j]
                            });
                        }
                    }
                }

                var set     = new[] { regular, pair0, pair1, pair2, pair3 };
                var product = set.CartesianProduct();
                var extra   = MarkStaticMagnetExtras(product);
                Slots.AddRange(extra);

                yield return(new EncounterArea4DPPt {
                    Location = (short)location, Type = SlotType.Grass, Slots = Slots.ToArray(), Rate = GrassRate
                });
            }

            var SurfRate = BitConverter.ToInt32(data, 0xCE);

            if (SurfRate > 0)
            {
                var area = new EncounterArea4DPPt {
                    Location = (short)location, Type = SlotType.Surf, Rate = SurfRate
                };
                GetSlots4WaterFishingDPPt(area, data, 0xD2, 5);
                yield return(area);
            }

            //44 bytes padding

            var OldRate = BitConverter.ToInt32(data, 0x126);

            if (OldRate > 0)
            {
                var area = new EncounterArea4DPPt {
                    Location = (short)location, Type = SlotType.Old_Rod, Rate = OldRate
                };
                GetSlots4WaterFishingDPPt(area, data, 0x12A, 5);
                yield return(area);
            }

            var GoodRate = BitConverter.ToInt32(data, 0x152);

            if (GoodRate > 0)
            {
                var area = new EncounterArea4DPPt {
                    Location = (short)location, Type = SlotType.Good_Rod, Rate = GoodRate
                };
                GetSlots4WaterFishingDPPt(area, data, 0x156, 5);
                yield return(area);
            }

            var SuperRate = BitConverter.ToInt32(data, 0x17E);

            if (SuperRate > 0)
            {
                var area = new EncounterArea4DPPt {
                    Location = (short)location, Type = SlotType.Super_Rod, Rate = SuperRate
                };
                GetSlots4WaterFishingDPPt(area, data, 0x182, 5);
                yield return(area);
            }
        }