Well, one good place to begin is by changing your collision masks to something relatively consistent. Given your sprite style, I'd suggest using either the rectangle or the circle (if you want some graphical leeway in taking hits). You'll want to make the boundaries in your player sprites relatively consistent too (focus on the main body width, don't worry so much about protruding limbs), so that your collision box doesn't do changes that might result in you getting yourself clipped into a wall.
You're going to want to make an unsprited, non-solid parent object called "ground" or something to that effect, and duplicate/modify your gravity code to check for a collision BELOW YOU ONLY, and to treat it as solid ground in such cases. Point your one-way grounds (each of them) towards your parent object, and make sure their collision boxes are only a pixel or two high (you don't want your character to treat the entire tile like it's ground, right? Just the top...); and make sure your "check" for it is a range that works with your maximum vspeed (in which case, move to contact, set vspeed = 0 & gravity = 0).
As far as animating goes? I'm still working on that myself. I have a flipping/rolling animation I play when jumping or rolling, and it continues even after I release the buttons, even though it's coded NOT to do that. The key thing to do is make your player characters based entirely on the collision mask intended, and then make "child" objects to reflect the animation changes. Although personally, I'm hoping I can eventually code together something that allows index_image arrays to be dynamically displayed, like:
runright = 1 (2 3 4 5) = image_index plays frame 1, then loops 2-5 until a different command is entered. There'll probably be a direction/angle variable in there, too.
Also note: "pressing nothing" can be mapped as a command with effects, too. So can "releasing something." This may be key in helping with that.
Beyond that, ya got me.