I could expand on the many suboptimal movesets that I've found but I think the problem is mostly to do with the implementation itself.
If you don't contemplate the option to define mandatory, exclusive, and/or combo moveslots, you really have to cut all the "barely useful" moveslots, because the separate redundancy checks can only do so much. They are useful to make sure that some combinations of almost identical moves don't show up together but they don't help making sure that each Pokemon get the STAB move(s) and/or useful support move(s) that it should always have. They aren't also very useful beyond considering more than two moves at the same time. An example of this is a substitute/focuspunch/bulkup/rockslide Hitmonlee set that I just got. Neither combination of moves is necessarily bad with each other to the point that you can generalize it to all 386 Pokemon, but all 4 moves together are suboptimal. It's the same kind of problems that gen 2 randbats used to have, execpt not as glaring because you've brute forced an insane amount of move redundancy checks.
When I see an object like this:
kingler: {
randomBattleMoves: ["doubleedge", "return", "bodyslam", "hiddenpowerground", "mudshot", "swordsdance", "crabhammer", "knockoff", "toxic", "rest", "sleeptalk", "haze", "surf"],
tier: "NU",
},
I cannot help but think that it's a recipe for disaster. Kingler should always have a normal and water move, but I can see how that could lead to a set like swordsdance/mudshot/knockoff/toxic or a sub-par rest-talk set very easily. Most of the niche moves should be gotten rid, and aim for 7/8 moves at most:
kingler: {
randomBattleMoves: ["doubleedge", "return", "bodyslam", "hiddenpowerground", "swordsdance", "crabhammer", "surf"],
tier: "NU",
},
And the redundacy checks should just ensure that the set is always sd/normalMove/waterMove/hpground. They should be simple enough that you're able to picture how they apply correctly to each Pokemon. Granted, these restrictions are not going to be very kind to Pokemon that can adopt multiple roles, but you can't afford to get a mix up of movesets every other time. You can see how the redundancy scripts are already crazy long yet they're far from covering all the issues.
I understand that the gen 2 randbats approach of making detailed movesets to all pokemon is too much work, moreso given that there are more pokemon in adv. But I think that adopting a design like gen 1 randbats would be a great improvement. Just defining a "combo" slot and one or two "exclusive" and/or "mandatory" slot would be enough to get decent results and would hugely get rid of all the unnecessary and hardly maintainable complexity of the redundancy scripts.
absol: {
inherit: true,
randomBattleMoves: ["aerialace", "hiddenpowerfighting"],
essentialMoves: ["swordsdance", "shadowball"],
exclusiveMoves: ["substitute", "taunt", "batonpass", "flamethrower", "thunderwave"],
comboMoves: ["calmmind", "icebeam", "thunderbolt"],
tier: "UU",
},
Here, you pick all moves in "comboMoves" half the times, then one at random from "exclusiveMoves". Alternatively, the other 50% of the times, you'd skip "comboMoves", add one from "exlusiveMoves" similarly, and since you still have more room, add all possible moves from "essentialMoves" and fill up the moveset with random draws from "randomBattleMoves". It is not 100% perfect but with enough creativity it can be quite versatile, and it's very simple to implement; far more than all the redundancy scripts that need to be expanded everytime a bad moveset is reported. With an implementation like this, I only needed to add around 4-5 very basic redundancy checks in gen 1 randbats. Being careful enough, you can also add the same move multiple times to adjust the final odds by making sure that moves already known are discarded.
If you're not willing to do something like this, at the very least Pokemon should get simple movesets. I've pointed Absol out because the two I've gotten have been absolutely awful. You would probably have to get rid of calmmind special variants for this set.