I guess what i'm basically saying is that the cels are perfect as far as i'm concerned, and their individual durations can be experimented with to express very different things even if their contents are still the same.
A general rule of thumb is trying to complement the contents/attributes/intentions of a cel by experimenting back and forth with the timing of each cel until it feels "natural".
I ought to add a quick example. Hope you don't mind me modifying your original.
First, i set the timing of your gif from 15 ppu frames for each cel to this:
12, 7, 25, 50.
12 for anticipation,
7 for a quick swing
25 for completion of swing and reversal of direction
50 for rest (quite trivial, could be anything decided by enemy AI, but probably always at least existing before resuming running or attacking again?)
But then the "speed lines" of the swing started to misinform the new timing. They inform me as a viewer that something is happening quickly, but i made them linger in the air unnaturally long.
Which i hadn't anticipated at first. I then split the troublesome cel into two so i could gain more control.
12, 7, 7, 18, 50
12 for anticipation
7 for a quick swing
7 for completion of swing
18 for reversal of direction - here, i simply took the same cel as before, but removed the "speed lines", assuming it was an individual sprite i could remove from the metasprite or at least void-fill with an empty sprite.
50 for rest.
The result of this split (which could be further refined of course): (Just to compare it with something real, the animation engine of Project Blue can only hold 4 cels per animation. That means a total animation of 5 cels requires *two* animation objects to be daisychained rear to front. In this case i'd probably justify the 5th cel requiring its own object by simply using it as the "idle" object, with or without any further animation. Oh, and each cel holds up to a maximum of 4 sprites, so it would actually require a lot more, haha).
I know exactly what you're talking about. I've been quite wasteful with a lot of my animations hardcoding every cel and its duration. That sure eats a lot of space! As i'm sure calima can attest to. (Sorry, calima!)For sprite timings theres a general update timer for everyone, and then metasprites can "override" it with their own. I use the general one for things like walking, as it saves cycles and space not having to hardcode everything. I did write a whole new animation engine on Monday, which has bugs and I am not using, and the poor prioritisation of which is likely why I missed the deadline!
Having a lean backup engine for more generic movement patterns which one deems can "get away with it" sounds very reasonable, especially in an action platformer.
You might've missed the deadline, but i'm really looking forward to see your project in all its splendor one day.
EDIT: point of clarification.
The "reversal of direction" is only existing in the ideal world, because this transition from movement to a full stop to a movement again in the other direction is summarized by one and the same cel in this example. Which can be totally fine as the timing itself implies this change of direction.