function boss_showerhead_ai() { facing_x = sign(global.player.x - x); image_xscale = facing_x; switch(state) { case "SPAWN": state = "IDLE"; idle_timer = 60; 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: state = "RETREAT"; x_spd = -boss_side * retreat_spd; set_sprite(sBossShowerheadRetreat); break; } } break; case "WINDUP": if animation_end() { shoot_count = 0; state = "SHOOT"; set_sprite(sBossShowerheadShoot); } break; case "SHOOT": if animation_end() { var _bomb = icl(oShowerheadBomb); _bomb.x_spd = facing_x * (8 + shoot_count * 2); _bomb.y_spd = -10; shoot_count++; if shoot_count >= 3 { state = "IDLE"; idle_timer = 60; set_sprite(sBossShowerheadIdle); } } break; case "SLAM": if animation_end() { // 生成预警线控制器 var _warn = icl(oBossWarning); _warn.phase = phase; state = "IDLE"; idle_timer = 60; set_sprite(sBossShowerheadIdle); } break; case "RETREAT": var _target = (boss_side == 1) ? anchor_l : anchor_r; if abs(x - _target) < abs(x_spd) { x = _target; x_spd = 0; state = "CHARGE"; x_spd = boss_side * charge_spd; set_sprite(sBossShowerheadCharge); } break; case "CHARGE": var _target = (boss_side == 1) ? anchor_r : anchor_l; if abs(x - _target) < abs(x_spd) { x = _target; x_spd = 0; boss_side *= -1; // 换边 state = "IDLE"; idle_timer = 60; set_sprite(sBossShowerheadIdle); } break; } }