private CheckResult VerifyCommonMemory(PKM pk, int handler, int gen, LegalInfo info, MemoryContext context)
    {
        var memory = MemoryVariableSet.Read((ITrainerMemories)pk, handler);

        // Actionable HM moves
        int hmIndex = Array.IndexOf(MemoryContext6.MoveSpecificMemoryHM, memory.MemoryID);

        if (hmIndex != -1)
        {
            if (gen != 6) // Gen8 has no HMs, so this memory can never exist.
            {
                return(GetInvalid(string.Format(LMemoryArgBadMove, memory.Handler)));
            }

            if (pk.Species != (int)Species.Smeargle)
            {
                // All AO hidden machine permissions are super-sets of Gen 3-5 games.
                // Don't need to check the move history -- a learned HM in a prior game can still be learned in Gen6.
                var evos       = info.EvoChainsAllGens.Gen6;
                var indexLearn = Array.FindIndex(evos, z => PersonalTable.AO.GetFormEntry(z.Species, 0).TMHM[100 + hmIndex]);
                if (indexLearn == -1)
                {
                    return(GetInvalid(string.Format(LMemoryArgBadMove, memory.Handler)));
                }
            }
        }

        if (context.IsInvalidGeneralLocationMemoryValue(memory.MemoryID, memory.Variable, info.EncounterMatch, pk))
        {
            return(GetInvalid(string.Format(LMemoryArgBadLocation, memory.Handler)));
        }

        if (context.IsInvalidMiscMemory(memory.MemoryID, memory.Variable))
        {
            return(GetInvalid(string.Format(LMemoryArgBadID, memory.Handler)));
        }

        switch (memory.MemoryID)
        {
        case 19 when pk.Species is (int)Species.Urshifu && memory.Variable is not 34:       // tall building is the only location for evolving Urshifu
        case 19 when pk.Species is (int)Species.Runerigus && memory.Variable is not 72:     // vast field is the only location for evolving Runerigus
            return(GetInvalid(string.Format(LMemoryArgBadLocation, memory.Handler)));

        // {0} saw {2} carrying {1} on its back. {4} that {3}.
        case 21 when gen != 6 || !PersonalTable.AO.GetFormEntry(memory.Variable, 0).TMHM[101]:     // Fly
            return(GetInvalid(string.Format(LMemoryArgBadMove, memory.Handler)));

        // {0} used {2} at {1}’s instruction, but it had no effect. {4} that {3}.
        // The Move Deleter that {0} met through {1} made it forget {2}. {4} that {3}.
        case 16 or 48 when !CanKnowMove(pk, memory, gen, info, memory.MemoryID == 16):
            return(GetInvalid(string.Format(LMemoryArgBadMove, memory.Handler)));

        case 49 when memory.Variable == 0 || !GetCanRelearnMove(pk, memory.Variable, gen, info.EvoChainsAllGens[gen]):
            return(GetInvalid(string.Format(LMemoryArgBadMove, memory.Handler)));

        // Dynamaxing
        // {0} battled at {1}’s side against {2} that Dynamaxed. {4} that {3}.
        case 71 when !GetCanDynamaxTrainer(memory.Variable, 8, handler == 0 ? (GameVersion)pk.Version : GameVersion.Any):
        // {0} battled {2} and Dynamaxed upon {1}’s instruction. {4} that {3}.
        case 72 when !PersonalTable.SWSH.IsSpeciesInGame(memory.Variable):
            return(GetInvalid(string.Format(LMemoryArgBadSpecies, memory.Handler)));

        // Move
        // {0} studied about how to use {2} in a Box, thinking about {1}. {4} that {3}.
        // {0} practiced its cool pose for the move {2} in a Box, wishing to be praised by {1}. {4} that {3}.
        case 80 or 81 when !CanKnowMove(pk, memory, gen, info):
            return(Get(string.Format(LMemoryArgBadMove, memory.Handler), Severity.Invalid));

        // Species
        // With {1}, {0} went fishing, and they caught {2}. {4} that {3}.
        case 7 when !GetCanFishSpecies(memory.Variable, gen, handler == 0 ? (GameVersion)pk.Version : GameVersion.Any):
            return(GetInvalid(string.Format(LMemoryArgBadSpecies, memory.Handler)));

        // {0} saw {1} paying attention to {2}. {4} that {3}.
        // {0} fought hard until it had to use Struggle when it battled at {1}’s side against {2}. {4} that {3}.
        // {0} was taken to a Pokémon Nursery by {1} and left with {2}. {4} that {3}.
        case 9 or 60 or 75 when gen == 8 && !PersonalTable.SWSH.IsSpeciesInGame(memory.Variable):
            return(GetInvalid(string.Format(LMemoryArgBadSpecies, memory.Handler)));

        // {0} had a great chat about {1} with the {2} that it was in a Box with. {4} that {3}.
        // {0} became good friends with the {2} in a Box, practiced moves with it, and talked about the day that {0} would be praised by {1}. {4} that {3}.
        // {0} got in a fight with the {2} that it was in a Box with about {1}. {4} that {3}.
        case 82 or 83 or 87 when !PersonalTable.SWSH.IsSpeciesInGame(memory.Variable):
            return(GetInvalid(string.Format(LMemoryArgBadSpecies, memory.Handler)));

        // {0} had a very hard training session with {1}. {4} that {3}.
        case 53 when gen == 8 && pk is IHyperTrain t && !t.IsHyperTrained():
            return(GetInvalid(string.Format(LMemoryArgBadID, memory.Handler)));

        // Item
        // {0} went to a Pokémon Center with {1} to buy {2}. {4} that {3}.
        case 5 when !CanBuyItem(gen, memory.Variable, handler == 0 ? (GameVersion)pk.Version : GameVersion.Any):
        // {1} used {2} when {0} was in trouble. {4} that {3}.
        case 15 when !CanUseItem(gen, memory.Variable, pk.Species):
        // {0} saw {1} using {2}. {4} that {3}.
        case 26 when !CanUseItemGeneric(gen, memory.Variable):
        // {0} planted {2} with {1} and imagined a big harvest. {4} that {3}.
        case 34 when !CanPlantBerry(gen, memory.Variable):
        // {1} had {0} hold items like {2} to help it along. {4} that {3}.
        case 40 when !CanHoldItem(gen, memory.Variable):
        // {0} was excited when {1} won prizes like {2} through Loto-ID. {4} that {3}.
        case 51 when !CanWinLotoID(gen, memory.Variable):
        // {0} was worried if {1} was looking for the {2} that it was holding in a Box. {4} that {3}.
        // When {0} was in a Box, it thought about the reason why {1} had it hold the {2}. {4} that {3}.
        case 84 or 88 when !Legal.HeldItems_SWSH.Contains(memory.Variable) || pk.IsEgg:
            return(GetInvalid(string.Format(LMemoryArgBadItem, memory.Handler)));
        }

        return(VerifyCommonMemoryEtc(memory, context));
    }