GML Getting a sprite to play more than one frame during an action.

I have an NPC that walks back and forth and when it comes in contact with the player, it punches. Pretty straight forward and it works, except the punch only lasts one frame despite having a full animated punch.

My punch sprites are set to 16fps. What I need is for it to meet the player and run through three frames, and on the last frame return to its normal sprite until the alarm hits zero and resets the next punch.

Creation event
Code:
vsp = 0;
grv = 0.3;
walksp = 4;
hsp = walksp;
hp = 3;
flash = 0;
can_punch = true;
hitfrom = 0;
Step Event
Code:
vsp = vsp + grv;

if (place_meeting(x+hsp,y,oWall))
{
    while (!place_meeting(x+sign(hsp),y,oWall)) //Ensures complete contact with object
    {
        x = x + sign(hsp);
    }
    hsp = -hsp;
}

x = x + hsp;

//Virticle collision
if (place_meeting(x,y+vsp,oWall))
{
    while (!place_meeting(x,y+sign(vsp),oWall))
    {
        y = y + sign(vsp);
    }
    vsp = 0;
}
y = y + vsp;

//Animation
if (!place_meeting(x,y+1,oWall))
{
    sprite_index = sEnemyFistJumpFall;
    image_speed = 0;
    if (sign(vsp) > 0) image_index = 1; else image_index = 0; //This choses between which frame will be used, up or down.
   
}
else
{
    image_speed = 1;
    if (hsp == 0)
    {
        sprite_index = sEnemyFist;
    }
    else
    {
        sprite_index = sEnemyFistR;
    }
}
    if (can_punch = true) && (place_meeting(x,y,oPlayer)) && ((oEnemyFist.sprite_index = sEnemyFist) || (oEnemyFist.sprite_index = sEnemyFistR) || (oEnemyFist.sprite_index = sEnemyFistJumpFall))//Action button + Standing + on ground
        {
            audio_play_sound(aPunch_swing,4,false); //Action sound
            sprite_index = sEnemyFist_punch;
            alarm[0] = 60;
            can_punch = false;
            with(instance_create_layer(x,y,"Bullets",oEnemyPunch_high)) //Hitbox
            {
                image_xscale = other.image_xscale;
            }

        }
       
    if (can_punch = true) && (place_meeting(x,y,oPlayer)) && (oEnemyFist.sprite_index = sEnemyFist_crouch) //Action button + Crouching + on ground
        {
            alarm[0] = 60;
            can_punch = false;
            audio_play_sound(aPunch_swing,4,false);
            sprite_index = sEnemyFist_crouch_punch;
            with(instance_create_layer(x,y,"Bullets",oEnemyPunch_low))
            {
                image_xscale = other.image_xscale;
            }
        }

//Image flips to changing direction
if (hsp != 0) image_xscale = sign(hsp);
 
Top