Пример #1
0
        public void EditRaids()
        {
            IFileContainer fp            = ROM.GetFile(GameFile.NestData);
            var            data_table    = new GFPack(fp[0]);
            const string   nest          = "nest_hole_encount.bin";
            var            nest_encounts = FlatBufferConverter.DeserializeFrom <EncounterNest8Archive>(data_table.GetDataFileName(nest));

            var arr   = nest_encounts.Tables;
            var cache = new DataCache <EncounterNest8Table>(arr);
            var games = new[] { "Sword", "Shield" };
            var names = arr.Select((z, i) => $"{games[z.GameVersion - 1]} - {i / 2}").ToArray();

            void Randomize()
            {
                var pt = ROM.Data.PersonalData;

                int[] ban = pt.Table.Take(ROM.Info.MaxSpeciesID + 1)
                            .Select((z, i) => new { Species = i, Present = ((PersonalInfoSWSH)z).IsPresentInGame })
                            .Where(z => !z.Present).Select(z => z.Species).ToArray();

                var spec  = EditUtil.Settings.Species;
                var srand = new SpeciesRandomizer(ROM.Info, ROM.Data.PersonalData);
                var frand = new FormRandomizer(ROM.Data.PersonalData);

                srand.Initialize(spec, ban);
                foreach (var t in arr)
                {
                    foreach (var p in t.Entries)
                    {
                        p.Species      = srand.GetRandomSpecies(p.Species);
                        p.AltForm      = frand.GetRandomForme(p.Species, false, false, true, true, ROM.Data.PersonalData.Table);
                        p.Ability      = 4;     // "A4" -- 1, 2, or H
                        p.Gender       = 0;     // random
                        p.IsGigantamax = false; // don't allow gmax flag on non-gmax species
                    }
                }
            }

            using var form = new GenericEditor <EncounterNest8Table>(cache, names, "Max Raid Battles Editor", Randomize);
            form.ShowDialog();
            if (!form.Modified)
            {
                return;
            }
            var data = FlatBufferConverter.SerializeFrom(nest_encounts);

            data_table.SetDataFileName(nest, data);
            fp[0] = data_table.Write();
        }
Пример #2
0
        private void PopWildEdit(GameFile type)
        {
            var file = ROM.GetFile(type);
            var data = file[0];
            var obj  = FlatBufferConverter.DeserializeFrom <EncounterArchive7b>(data);

            using var form = new GGWE(ROM, obj);
            if (form.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            data    = FlatBufferConverter.SerializeFrom(obj);
            file[0] = data;
        }
Пример #3
0
        private void PopWildEdit(string file)
        {
            var winner = Path.Combine(ROM.PathRomFS, "bin", "field", "param", "encount", file);
            var obj    = FlatBufferConverter.DeserializeFrom <EncounterArchive7b>(winner);

            using var form = new GGWE(ROM, obj);
            if (form.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            var data = FlatBufferConverter.SerializeFrom(obj);

            FileMitm.WriteAllBytes(winner, data);
        }
Пример #4
0
        private bool CreateGenericEditor <TA, T1>(ref byte[] data, string title, string[] names = null) where TA : IFlatBufferArchive <T1> where T1 : class
        {
            var objs = FlatBufferConverter.DeserializeFrom <TA>(data);

            if (names == null)
            {
                names = Enumerable.Range(1, objs.Table.Length).Select(z => z.ToString()).ToArray();
            }
            var result = PopEdit(objs.Table, title, names);

            if (result)
            {
                data = FlatBufferConverter.SerializeFrom(objs);
            }
            return(result);
        }
Пример #5
0
        public void EditRental()
        {
            var obj     = ROM[GameFile.Rentals];
            var data    = obj[0];
            var rentals = FlatBufferConverter.DeserializeFrom <Rental8Archive>(data);
            var cache   = new DataCache <Rental8>(rentals.Table);
            var names   = rentals.Table.Select((z, i) => $"{i:000} {z.Hash1:X16}").ToArray();

            using var form = new GenericEditor <Rental8>(cache, names, "Rental Editor");
            form.ShowDialog();
            if (!form.Modified)
            {
                cache.CancelEdits();
                return;
            }
            obj[0] = FlatBufferConverter.SerializeFrom(rentals);
        }
Пример #6
0
        public void EditPlacement()
        {
            var arc        = ROM.GetFile(GameFile.Placement);
            var placement  = new GFPack(arc[0]);
            var area_names = new AHTB(placement.GetDataFileName("AreaNameHashTable.tbl")).ToDictionary();

            List <PlacementArea8Archive> areas = new();
            List <string> names = new();

            foreach (var area in area_names)
            {
                var areaName = area.Value;
                var fileName = $"{areaName}.bin";
                if (placement.GetIndexFileName(fileName) < 0)
                {
                    continue;
                }

                var bin  = placement.GetDataFileName(fileName);
                var data = FlatBufferConverter.DeserializeFrom <PlacementArea8Archive>(bin);

                names.Add(fileName);
                areas.Add(data);
            }

            var arr     = areas.ToArray();
            var nameArr = names.ToArray();
            var cache   = new DataCache <PlacementArea8Archive>(arr);
            var form    = new GenericEditor <PlacementArea8Archive>(cache, nameArr, "Placement", canSave: true);

            form.ShowDialog();
            if (!form.Modified)
            {
                return;
            }

            // Stuff files back into the gfpak and save
            for (int i = 0; i < arr.Length; i++)
            {
                var obj = arr[i];
                var bin = FlatBufferConverter.SerializeFrom(obj);
                placement.SetDataFileName(nameArr[i], bin);
            }
            arc[0] = placement.Write();
        }
Пример #7
0
        private void PopWildEdit(string file)
        {
            IFileContainer fp         = ROM.GetFile(GameFile.NestData);
            var            data_table = new GFPack(fp[0]);
            var            s          = FlatBufferConverter.DeserializeFrom <EncounterArchive8>(data_table.GetDataFileName($"encount_symbol_{file}.bin"));
            var            h          = FlatBufferConverter.DeserializeFrom <EncounterArchive8>(data_table.GetDataFileName($"encount_{file}.bin"));

            using var form = new SSWE(ROM, s, h);
            form.ShowDialog();

            var sd = FlatBufferConverter.SerializeFrom(s);
            var hd = FlatBufferConverter.SerializeFrom(s);

            data_table.SetDataFileName($"encount_symbol_{file}.bin", sd);
            data_table.SetDataFileName($"encount_{file}.bin", hd);

            fp[0] = data_table.Write();
        }
Пример #8
0
        public void EditDynamaxAdv()
        {
            var arc  = ROM.GetFile(GameFile.DynamaxDens);
            var data = arc[0];
            var objs = FlatBufferConverter.DeserializeFrom <EncounterUnderground8Archive>(data);

            var table = objs.Table;
            var names = Enumerable.Range(0, table.Length).Select(z => $"{z:000}").ToArray();
            var cache = new DirectCache <EncounterUnderground8>(table);

            void Randomize()
            {
                var pt = ROM.Data.PersonalData;

                int[] ban = pt.Table.Take(ROM.Info.MaxSpeciesID + 1)
                            .Select((z, i) => new { Species = i, Present = ((PersonalInfoSWSH)z).IsPresentInGame })
                            .Where(z => !z.Present).Select(z => z.Species).ToArray();

                var spec  = EditUtil.Settings.Species;
                var srand = new SpeciesRandomizer(ROM.Info, ROM.Data.PersonalData);
                var frand = new FormRandomizer(ROM.Data.PersonalData);

                srand.Initialize(spec, ban);
                foreach (var t in table)
                {
                    // what you receive
                    t.Species = srand.GetRandomSpecies(t.Species);
                    t.Form    = (byte)frand.GetRandomForme(t.Species, false, false, true, true, ROM.Data.PersonalData.Table);
                    t.Ability = (uint)Randomization.Util.Random.Next(1, 4); // 1, 2, or H
                    t.Move0   = t.Move1 = t.Move2 = t.Move3 = 0;
                }
            }

            using var form = new GenericEditor <EncounterUnderground8>(cache, names, "Dynamax Adventures Encounter Editor", Randomize);
            form.ShowDialog();
            if (!form.Modified)
            {
                arc.CancelEdits();
            }
            else
            {
                arc[0] = FlatBufferConverter.SerializeFrom(objs);
            }
        }
Пример #9
0
        public string ConvertToString()
        {
            if (IFileInfo.ArchiveParent != null)
            {
                foreach (var file in IFileInfo.ArchiveParent.Files)
                {
                    if (file.FileName == FileName)
                    {
                        return(FlatBufferConverter.DeserializeToJson(new System.IO.MemoryStream(file.FileData), "gfbanm"));
                    }
                }
            }
            else
            {
                return(FlatBufferConverter.DeserializeToJson(FilePath, "gfbanm"));
            }

            return("");
        }
Пример #10
0
        public MapViewer8a(GameManagerPLA rom, GFPack resident)
        {
            ROM      = rom;
            Resident = resident;
            var bin_settings = resident.GetDataFullPath("bin/field/resident/AreaSettings.bin");

            Settings = FlatBufferConverter.DeserializeFrom <AreaSettingsTable8a>(bin_settings);

            InitializeComponent();

            Areas = ResidentAreaSet.AreaNames.Select(z => AreaInstance8a.Create(Resident, z, Settings)).ToArray();
            var speciesNames = ROM.GetStrings(TextName.SpeciesNames);

            CB_Map.Items.AddRange(Areas.Select(z => z.ParentArea?.AreaName ?? z.AreaName).ToArray());

            var pt       = rom.Data.PersonalData;
            var nameList = new List <ComboItem>();

            foreach (var e in pt.Table.OfType <PersonalInfoLA>())
            {
                if (!e.IsPresentInGame)
                {
                    continue;
                }

                var species = e.Species;
                if (nameList.All(z => z.Value != species))
                {
                    nameList.Add(new(speciesNames[species], species));
                }
            }

            nameList.Insert(0, new("(Any)", -1));
            nameList.Sort((x, y) => string.Compare(x.Text, y.Text, StringComparison.InvariantCulture));

            CB_Species.DisplayMember = nameof(ComboItem.Text);
            CB_Species.ValueMember   = nameof(ComboItem.Value);
            CB_Species.DataSource    = new BindingSource(nameList, null);

            CB_Species.SelectedValue = 399;
            Loading = false;
            CB_Map.SelectedIndex = 0;
        }
Пример #11
0
        private void ResetData()
        {
            var pbin       = this[GameFile.PersonalStats][0];
            var personal   = FlatBufferConverter.DeserializeFrom <PersonalTableLA>(pbin);
            var evos       = this[GameFile.Evolutions][0];
            var evoTable   = FlatBufferConverter.DeserializeFrom <EvolutionTable8>(evos);
            var learn      = this[GameFile.Learnsets][0];
            var learnTable = FlatBufferConverter.DeserializeFrom <Learnset8a>(learn);

            Data = new GameData8a
            {
                // Folders
                MoveData = GetMoves(),

                // Custom
                PersonalData = new PersonalTable(personal.Table.Select(z => new PersonalInfoLA(z)).ToArray(), 905),

                // Single Files
                LevelUpData   = new DataCache <Learnset8aMeta>(learnTable.Table),
                EvolutionData = new DataCache <EvolutionSet8a>(evoTable.Table),
            };
        }
Пример #12
0
        public override void Initialize()
        {
            base.Initialize();

            // initialize gametext
            ResetText();

            // initialize common structures
            var personal   = GetFilteredFolder(GameFile.PersonalStats, z => Path.GetFileNameWithoutExtension(z) == "personal_total");
            var learn      = this[GameFile.Learnsets][0];
            var splitLearn = learn.Split(0x104);

            Learn = new FakeContainer(splitLearn);

            var move = this[GameFile.MoveStats];

            ((FolderContainer)move).Initialize();
            Data = new GameData
            {
                MoveData = new DataCache <IMove>(move)
                {
                    Create = FlatBufferConverter.DeserializeFrom <Waza8>,
                    Write  = z => FlatBufferConverter.SerializeFrom((Waza8)z),
                },
                LevelUpData = new DataCache <Learnset>(Learn)
                {
                    Create = z => new Learnset8(z),
                    Write  = z => z.Write(),
                },

                // folders
                PersonalData  = new PersonalTable(personal[0], Game),
                EvolutionData = new DataCache <EvolutionSet>(GetFilteredFolder(GameFile.Evolutions))
                {
                    Create = data => new EvolutionSet8(data),
                    Write  = evo => evo.Write(),
                },
            };
        }
Пример #13
0
        public void EditRBonusRewards()
        {
            IFileContainer fp         = ROM.GetFile(GameFile.NestData);
            var            data_table = new GFPack(fp[0]);
            const string   nest       = "nest_hole_bonus_rewards.bin";
            var            nest_bonus = FlatBufferConverter.DeserializeFrom <NestHoleReward8Archive>(data_table.GetDataFileName(nest));

            var arr   = nest_bonus.Tables;
            var cache = new DataCache <NestHoleReward8Table>(arr);
            var names = arr.Select((z, i) => $"{z.TableID}").ToArray();

            using var form = new GenericEditor <NestHoleReward8Table>(cache, names, "RBonus Rewards");
            form.ShowDialog();
            if (!form.Modified)
            {
                return;
            }

            var data = FlatBufferConverter.SerializeFrom(nest_bonus);

            data_table.SetDataFileName(nest, data);
            fp[0] = data_table.Write();
        }
Пример #14
0
        public void EditRaid()
        {
            IFileContainer fp            = ROM.GetFile(GameFile.NestData);
            var            data_table    = new GFPack(fp[0]);
            const string   nest          = "nest_hole_encount.bin";
            var            nest_encounts = FlatBufferConverter.DeserializeFrom <EncounterNest8Archive>(data_table.GetDataFileName(nest));

            var arr   = nest_encounts.Tables;
            var cache = new DataCache <EncounterNest8Table>(arr);
            var games = new[] { "Sword", "Shield" };
            var names = arr.Select((z, i) => $"{games[z.GameVersion - 1]} - {i / 2}").ToArray();

            using var form = new GenericEditor <EncounterNest8Table>(cache, names, "Raid Encounters");
            form.ShowDialog();
            if (!form.Modified)
            {
                return;
            }

            var data = FlatBufferConverter.SerializeFrom(nest_encounts);

            data_table.SetDataFileName(nest, data);
            fp[0] = data_table.Write();
        }
Пример #15
0
        public void EditRaidRewards()
        {
            IFileContainer fp         = ROM.GetFile(GameFile.NestData);
            var            data_table = new GFPack(fp[0]);
            const string   nest       = "nest_hole_drop_rewards.bin";

            byte[] originalData = data_table.GetDataFileName(nest);
            var    nest_drops   = FlatBufferConverter.DeserializeFrom <NestHoleReward8Archive>(originalData);

            var arr   = nest_drops.Table;
            var cache = new DataCache <NestHoleReward8Table>(arr);
            var names = arr.Select(z => $"{z.TableID}").ToArray();

            void Randomize()
            {
                int[] PossibleHeldItems = Legal.GetRandomItemList(ROM.Info.Game);
                foreach (var t in arr)
                {
                    foreach (var i in t.Entries)
                    {
                        i.ItemID = (uint)PossibleHeldItems[Randomization.Util.Random.Next(PossibleHeldItems.Length)];
                    }
                }
            }

            using var form = new GenericEditor <NestHoleReward8Table>(cache, names, "Raid Rewards Editor", Randomize);
            form.ShowDialog();
            if (!form.Modified)
            {
                return;
            }
            var data = FlatBufferConverter.SerializeFrom(nest_drops);

            data_table.SetDataFileName(nest, data);
            fp[0] = data_table.Write();
        }
 public byte[] Write() => FlatBufferConverter.SerializeFrom(this);
Пример #17
0
        private void EditShop(bool shop2)
        {
            var arc  = ROM.GetFile(GameFile.Shops);
            var data = arc[0];

            int[] PossibleHeldItems = Legal.GetRandomItemList(ROM.Game);
            var   shop = FlatBufferConverter.DeserializeFrom <ShopInventory>(data);

            if (!shop2)
            {
                var table = shop.Shop1;
                var names = table.Select((z, _) => $"{(z.LGPE.TryGetValue(z.Hash, out var shopName) ? shopName : z.Hash.ToString("X"))}").ToArray();
                var cache = new DirectCache <Shop1>(table);
                using var form = new GenericEditor <Shop1>(cache, names, $"{nameof(Shop1)} Editor", Randomize);
                form.ShowDialog();
                if (!form.Modified)
                {
                    arc.CancelEdits();
                    return;
                }

                void Randomize()
                {
                    for (int s = 1; s < table.Length; s++) // skip first table with TMs (unobtainable otherwise)
                    {
                        var shopDefinition = table[s];
                        var items          = shopDefinition.Inventory.Items;
                        for (int i = 0; i < items.Length; i++)
                        {
                            items[i] = PossibleHeldItems[Randomization.Util.Random.Next(PossibleHeldItems.Length)];
                        }
                    }
                }
            }
            else
            {
                var table = shop.Shop2;
                var names = table.Select((z, _) => $"{(z.LGPE.TryGetValue(z.Hash, out var shopName) ? shopName : z.Hash.ToString("X"))}").ToArray();
                var cache = new DirectCache <Shop2>(table);
                using var form = new GenericEditor <Shop2>(cache, names, $"{nameof(Shop2)} Editor", Randomize);
                form.ShowDialog();
                if (!form.Modified)
                {
                    arc.CancelEdits();
                    return;
                }

                void Randomize()
                {
                    foreach (var shopDefinition in table)
                    {
                        foreach (var inv in shopDefinition.Inventories)
                        {
                            var items = inv.Items;
                            for (int i = 0; i < items.Length; i++)
                            {
                                items[i] = PossibleHeldItems[Randomization.Util.Random.Next(PossibleHeldItems.Length)];
                            }
                        }
                    }
                }
            }
            arc[0] = FlatBufferConverter.SerializeFrom(shop);
        }
Пример #18
0
 private void TryWrite <T1>(string path, T1 obj) where T1 : class =>
 TryWrite(path, FlatBufferConverter.SerializeFrom(obj));
Пример #19
0
        public void EditGift()
        {
            var arc  = ROM.GetFile(GameFile.EncounterGift);
            var data = arc[0];
            var objs = FlatBufferConverter.DeserializeFrom <EncounterGift8Archive>(data);

            var gifts = objs.Table;
            var names = Enumerable.Range(0, gifts.Length).Select(z => $"{z:000}").ToArray();
            var cache = new DirectCache <EncounterGift8>(gifts);

            void Randomize()
            {
                int[] PossibleHeldItems = Legal.GetRandomItemList(ROM.Game);
                var   pt = ROM.Data.PersonalData;

                int[] ban = pt.Table.Take(ROM.Info.MaxSpeciesID + 1)
                            .Select((z, i) => new { Species = i, Present = ((PersonalInfoSWSH)z).IsPresentInGame })
                            .Where(z => !z.Present).Select(z => z.Species).ToArray();

                var spec  = EditUtil.Settings.Species;
                var srand = new SpeciesRandomizer(ROM.Info, ROM.Data.PersonalData);
                var frand = new FormRandomizer(ROM.Data.PersonalData);

                srand.Initialize(spec, ban);
                foreach (var t in gifts)
                {
                    // swap gmax gifts and kubfu for other gmax capable species
                    if (t.CanGigantamax || t.Species == (int)Species.Kubfu)
                    {
                        t.Species = Legal.GigantamaxForms[Randomization.Util.Random.Next(Legal.GigantamaxForms.Length)];
                        t.Form    = (byte)(t.Species == (int)Species.Pikachu || t.Species == (int)Species.Meowth ? 0 : frand.GetRandomForme(t.Species, false, false, false, false, ROM.Data.PersonalData.Table)); // Pikachu & Meowth altforms can't gmax
                    }
                    else
                    {
                        t.Species = srand.GetRandomSpecies(t.Species);
                        t.Form    = (byte)frand.GetRandomForme(t.Species, false, false, true, true, ROM.Data.PersonalData.Table);
                    }

                    t.Ability   = Randomization.Util.Random.Next(1, 4); // 1, 2, or H
                    t.Ball      = (Ball)Randomization.Util.Random.Next(1, EncounterGift8.BallToItem.Length);
                    t.HeldItem  = PossibleHeldItems[Randomization.Util.Random.Next(PossibleHeldItems.Length)];
                    t.Nature    = (int)Nature.Random25;
                    t.Gender    = (byte)FixedGender.Random;
                    t.ShinyLock = (int)Shiny.Random;
                    if (t.IV_HP != -4 && t.IVs.Any(z => z != 31))
                    {
                        t.IVs = new[] { -1, -1, -1, -1, -1, -1 }
                    }
                    ;
                }

                UpdateStarters(); // update placement critter data to match new randomized species
            }

            void UpdateStarters()
            {
                var container = ROM.GetFile(GameFile.Placement);
                var placement = new GFPack(container[0]);

                // a_r0501_i0101.bin for Toxel
                // a_bt0101.bin for Type: Null
                // a_wr0201_i0101.bin for Bulbasaur, Squirtle, Porygon, and Kubfu
                // a_wr0301_i0401.bin for Cosmog
                // a_d0901.bin for Poipole
                const string file     = "a_0101.bin";
                var          table    = placement.GetDataFileName(file);
                var          obj      = FlatBufferConverter.DeserializeFrom <PlacementArea8Archive>(table);
                var          critters = obj.Table[0].Critters;

                // Grookey
                critters[3].Species = (uint)gifts[0].Species;
                critters[3].Form    = gifts[0].Form;

                // Scorbunny
                critters[1].Species = (uint)gifts[3].Species;
                critters[1].Form    = gifts[3].Form;

                // Sobble
                critters[2].Species = (uint)gifts[4].Species;
                critters[2].Form    = gifts[4].Form;

                var bin = FlatBufferConverter.SerializeFrom(obj);

                placement.SetDataFileName(file, bin);
                container[0] = placement.Write();
            }

            using var form = new GenericEditor <EncounterGift8>(cache, names, "Gift Pokémon Editor", Randomize);
            form.ShowDialog();
            if (!form.Modified)
            {
                arc.CancelEdits();
            }
            else
            {
                arc[0] = FlatBufferConverter.SerializeFrom(objs);
            }
        }
Пример #20
0
 public void SaveFile(System.IO.Stream stream)
 {
     using (var writer = new FileWriter(stream)) {
         writer.Write(FlatBufferConverter.SerializeFrom <Model>(Model, "gfbmdl"));
     }
 }
Пример #21
0
        public void EditGift()
        {
            var arc  = ROM.GetFile(GameFile.EncounterGift);
            var data = arc[0];
            var objs = FlatBufferConverter.DeserializeFrom <EncounterGift8Archive>(data);

            var gifts = objs.Table;
            var names = Enumerable.Range(0, gifts.Length).Select(z => $"{z:000}").ToArray();
            var cache = new DirectCache <EncounterGift8>(gifts);

            void Randomize()
            {
                int[] PossibleHeldItems = Legal.GetRandomItemList(ROM.Game);
                var   pt = ROM.Data.PersonalData;

                int[] ban = pt.Table.Take(ROM.Info.MaxSpeciesID + 1)
                            .Select((z, i) => new { Species = i, Present = ((PersonalInfoSWSH)z).IsPresentInGame })
                            .Where(z => !z.Present).Select(z => z.Species).ToArray();

                var spec  = EditUtil.Settings.Species;
                var srand = new SpeciesRandomizer(ROM.Info, ROM.Data.PersonalData);
                var frand = new FormRandomizer(ROM.Data.PersonalData);

                srand.Initialize(spec, ban);
                foreach (var t in gifts)
                {
                    // swap gmax gifts and kubfu for other gmax capable species
                    if (t.CanGigantamax || t.Species == Species.Kubfu)
                    {
                        t.Species = (Species)Legal.GigantamaxForms[Randomization.Util.Random.Next(Legal.GigantamaxForms.Length)];
                        t.AltForm = t.Species == Species.Pikachu || t.Species == Species.Meowth ? 0 : frand.GetRandomForme((int)t.Species, false, false, false, false, ROM.Data.PersonalData.Table); // Pikachu & Meowth altforms can't gmax
                    }
                    else
                    {
                        t.Species = (Species)srand.GetRandomSpecies((int)t.Species);
                        t.AltForm = frand.GetRandomForme((int)t.Species, false, false, true, true, ROM.Data.PersonalData.Table);
                    }

                    t.Ability   = Randomization.Util.Random.Next(1, 4);        // 1, 2, or H
                    t.Ball      = (Ball)Randomization.Util.Random.Next(1, 15); // packed bit, only allows for 15 balls
                    t.HeldItem  = PossibleHeldItems[Randomization.Util.Random.Next(PossibleHeldItems.Length)];
                    t.Nature    = Nature.Random25;
                    t.Gender    = FixedGender.Random;
                    t.ShinyLock = Shiny.Random;
                    if (t.IV_Hp != -4)
                    {
                        t.IV_Hp = t.IV_Atk = t.IV_Def = t.IV_SpAtk = t.IV_SpDef = t.IV_Spe = -1;
                    }
                }
            }

            using var form = new GenericEditor <EncounterGift8>(cache, names, "Gift Pokémon Editor", Randomize);
            form.ShowDialog();
            if (!form.Modified)
            {
                arc.CancelEdits();
            }
            else
            {
                arc[0] = FlatBufferConverter.SerializeFrom(objs);
            }
        }