function boss_showerhead_ai()
{
    image_xscale = -boss_side;
    
    switch(state)
    {
		case "AWAIT":
			if global.player.x <= 3/4 * room_width
			{
				state = "SPAWN";
				animation_spd = 0.25;
				lock_player();
				lock_door();
			}
        case "SPAWN":
			if image_index == 10
			{
				for(var i = 0; i < 5; i++)
					icd(oShockwave, x, y, 0, {delay : i * 10});
				screen_shake(20);
			}
			else if animation_end()
			{
				unlock_player();
				state = "IDLE";
				idle_timer = 60;
			}
            break;
        
        case "WINDUP":
            if animation_end()
            {
                shoot_count = 0;
                state = "SHOOT";
                set_sprite(sBossShowerheadShoot);
            }
            break;
        
        case "SHOOT":
            if animation_end()
            {
                var _bomb = icl(oShowerheadBomb, x, y - 64);
                _bomb.x_spd = -boss_side * (4 - shoot_count * 1.5);
                _bomb.y_spd = -10;
				
				image_index = 0;
                
                if ++shoot_count >= 3
                {
                    state = "IDLE";
                    idle_timer = 60;
                    set_sprite(sBossShowerheadIdle);
                }
            }
            break;
        
        case "SLAM":
            if animation_end()
		    {
		        var _sep = 240;
		        var _start = irandom(_sep - 1);
        
		        var _x = _start;
		        while _x < room_width
		        {
		            icl(oShowerheadColumn, _x, room_height);
		            _x += _sep;
		        }

				screen_shake(10);
				
                state = "IDLE";
                idle_timer = 60;
                set_sprite(sBossShowerheadIdle);
            }
            break;
        
        case "IDLE":
		    if --idle_timer <= 0
		    {
		        var _next = attack_queue[attack_index];
		        attack_index = (attack_index + 1) % array_length(attack_queue);
        
		        switch(_next)
		        {
		            case 1:
		                state = "WINDUP";
		                set_sprite(sBossShowerheadWindup);
		                break;
		            case 2:
		                state = "SLAM";
		                set_sprite(sBossShowerheadSlam);
		                break;
		            case 3:
		                x_spd = boss_side * retreat_spd;
		                state = "RETREAT";
		                set_sprite(sBossShowerheadRetreat);
		                break;
		        }
		    }
		    break;

		case "RETREAT":
		    var _target = (boss_side == 1) ? anchor_r + 128 : anchor_l - 128;
		    if (boss_side == 1 && x >= _target) || (boss_side == -1 && x <= _target)
		    {
		        x     = _target;
		        x_spd = -boss_side * charge_spd;
		        state = "CHARGE";
		        set_sprite(sBossShowerheadCharge);
		    }
		    break;

		case "CHARGE":
		    var _target = (boss_side == 1) ? anchor_l : anchor_r;
		    if (boss_side == 1 && x <= _target) || (boss_side == -1 && x >= _target)
		    {
		        x        = _target;
		        x_spd    = 0;
		        boss_side *= -1;
		        state    = "IDLE";
		        idle_timer = 60;
		        set_sprite(sBossShowerheadIdle);
		    }
		    break;
    }
}