Beat'em'up AI: How to store different attack types

That depends how you implement it. If the code is short, a bit of redundancy it wont hurt, but if you think its a lot, you can create a function that makes the ‘shared’ code part and call it within each separate attack function. Or you could create custom Events for the Attacks and functions for the shared bits of code.