minisphere's COMMAND_ANIMATE implementation looks like this:
switch (command) {
case COMMAND_ANIMATE:
person->revert_frames = person->revert_delay;
if (person->anim_frames > 0 && --person->anim_frames == 0) {
++person->frame;
person->anim_frames = get_sprite_frame_delay(person->sprite, person->direction, person->frame);
}
break;
// ...
}
And for good measure, get_sprite_frame_delay:
int
get_sprite_frame_delay(const spriteset_t* spriteset, const char* pose_name, int frame_index)
{
const spriteset_pose_t* pose;
if ((pose = find_sprite_pose(spriteset, pose_name)) == NULL)
return 0;
frame_index %= pose->num_frames;
return pose->frames[frame_index].delay;
}
Looking at this code, I don't understand why this is happening, but I'm rather tired at the moment. I'll have to investigate properly in the morning.