public void fixSoftlock()
        {
            BattleWrapper odoroBattle = battles[0xA4];

            byte firstFixedPart = 0x0;

            if (odoroBattle.content.bots[0].isComplete())
            {
                odoroBattle.content.bots[0].head      = firstFixedPart;
                odoroBattle.content.bots[0].right_arm = firstFixedPart;
                odoroBattle.content.bots[0].left_arm  = firstFixedPart;
                odoroBattle.content.bots[0].legs      = firstFixedPart;
                odoroBattle.content.bots[0].medal     = IdTranslator.botMedal(firstFixedPart);
            }
            else
            {
                odoroBattle.content.bots[0].head = firstFixedPart;
            }

            byte secondFixedPart = 0x4;

            if (odoroBattle.content.bots[1].isComplete())
            {
                odoroBattle.content.bots[1].head      = secondFixedPart;
                odoroBattle.content.bots[1].right_arm = secondFixedPart;
                odoroBattle.content.bots[1].left_arm  = secondFixedPart;
                odoroBattle.content.bots[1].legs      = secondFixedPart;
                odoroBattle.content.bots[1].medal     = IdTranslator.botMedal(secondFixedPart);
            }
            else
            {
                odoroBattle.content.bots[1].right_arm = secondFixedPart;
            }

            BattleWrapper kappaBattle = battles[0x39];
            int           i           = rng.Next(0, 3);

            byte kappaFixedPart = 0x6C;

            if (kappaBattle.content.bots[i].isComplete())
            {
                kappaBattle.content.bots[i].head      = kappaFixedPart;
                kappaBattle.content.bots[i].right_arm = kappaFixedPart;
                kappaBattle.content.bots[i].left_arm  = kappaFixedPart;
                kappaBattle.content.bots[i].legs      = kappaFixedPart;
                kappaBattle.content.bots[i].medal     = IdTranslator.botMedal(kappaFixedPart);
            }
            else
            {
                kappaBattle.content.bots[i].head = kappaFixedPart;
            }
        }
 private byte getBestMedal(BattleBot bot)
 {
     return(IdTranslator.botMedal(bot.head));
 }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            //Utils.Shuffle<BattleWrapper>(allBattles);
            if (randomizebattles.IsChecked.Value)
            {
                float mixedchance = 0;
                if (mixedbots.IsChecked.Value)
                {
                    mixedchance = (float)(mixedslider.Value / 100);
                }
                bool keep_team_structure    = keepstructure.IsChecked.Value;
                bool balanced_medal_level   = balancedlevels.IsChecked.Value;
                bool keep_battle_continuity = battlecontinuity.IsChecked.Value;
                randomizer.RandomizeBattles(keep_team_structure, balanced_medal_level, mixedchance, keep_battle_continuity);
            }
            if (randomizecharacters.IsChecked.Value)
            {
                bool continuity = continuitycheck.IsChecked.Value;
                randomizer.RandomizeCharacters(continuity);
            }
            int amount_of_battles = 0xf5;
            int battle_size       = 0x28;

            for (int i = 0; i <= amount_of_battles; i++)
            {
                int    battle_address = Utils.GetAdressAtPosition(file, memory_offsets[game_id]["Battles"] + 4 * i);
                byte[] battle         = StructUtils.getBytes(allBattles[i].content);
                //byte[] battle = randomizer.GenerateRandomBattle(false).getBytes();
                Array.Copy(battle, 0, file, battle_address, battle_size);
            }
            if (shouldPatch.IsChecked.Value)
            {
                uint   jumpOffset    = 0x104;
                uint   hookOffset    = 0x7f3530;
                uint   trainerOffset = 0x7f3600;
                uint   instr1        = (uint)Utils.GetIntAtPosition(file, (int)jumpOffset);
                uint   instr2        = (uint)Utils.GetIntAtPosition(file, (int)jumpOffset + 4);
                uint   instr3        = (uint)Utils.GetIntAtPosition(file, (int)jumpOffset + 8);
                uint[] jumpPayload   = new uint[]
                {
                    0xE92D8000,                         // push r15
                    0xE51FF004,                         // ldr r15, traineraddr
                    0x08000000 + hookOffset             // hookOffset
                };
                uint[] hookPayload = new uint[]
                {
                    0xE92D4000,                         // push r14
                    0xE3A0E402,                         // mov r14, #0x2000000
                    0xE28EE701,                         // add r14, #40000
                    0xE24EE004,                         // sub r14, #28
                    0xE90E08FF,                         // stmdb [r14], r0-r7, r11
                    0xEB00002D,                         // bl trainerfunc
                    0xE3A0E402,                         // mov r14, #0x2000000
                    0xE28EE701,                         // add r14, #40000
                    0xE24EE028,                         // sub r14, #28
                    0xE89E08FF,                         // ldmia [r14], r0-r7, r11
                    0xE8BD4000,                         // pop r14
                    instr1,                             // --- original instruction #1 ---
                    instr2,                             // --- original instruction #2 ---
                    instr3,                             // --- original instruction #3 ---
                    0xE8BD8000                          // pop r15
                };
                uint[] trainerPayload = new uint[]
                {
                    // Set text_speed to instant
                    0xE3A01403,                         // mov r1, #0x3000000
                    0xE3A000FF,                         // mov r0, #0xFF
                    0xE5C1045A,                         // strb r0, [r1, #0x45A]
                    // Return
                    0xE12FFF1E                          // bx r15
                };
                Dictionary <uint, ushort> codePatches = new Dictionary <uint, ushort>
                {
                    // Instant Character Popup
                    { 0x3F5F6, 0x3008 },
                    { 0x3F600, 0xDC08 }
                };
                WritePayload(file, jumpOffset, jumpPayload);
                WritePayload(file, hookOffset, hookPayload);
                WritePayload(file, trainerOffset, trainerPayload);
                WritePatches(file, codePatches);
            }

            byte[] blacklist = new byte[] { 1, 3, 6, 7, 8,
                                            14, 15, 17, 18,
                                            19, 20, 22, 23,
                                            25, 26, 27, 28,
                                            39, 40, 45, 50,
                                            57, 66, 72, 75,
                                            77, 80, 81, 82,
                                            84, 90, 91, 92,
                                            96, 100, 101, 104,
                                            110, 115, 117, 118 };

            if (randomizeStarter.IsChecked.Value)
            {
                byte randomBot = (byte)new Random().Next(0, 0x78);
                while (blacklist.Contains(randomBot))
                {
                    randomBot = (byte)new Random().Next(0, 0x78);
                }
                int offset = memory_offsets[game_id]["Starter"];
                for (int i = 0; i < 4; i++)
                {
                    file[offset + 4 * i] = randomBot;
                }
                if (IdTranslator.isFemale(randomBot))
                {
                    file[offset + 16] = 1;
                }
                file[memory_offsets[game_id]["Equipped"]]       = randomBot;
                file[memory_offsets[game_id]["Equipped"] + 0xE] = (byte)(randomBot * 2 + 1);
            }

            File.WriteAllBytes("randomized.gba", file);
        }