I personally prefer using ascents. Arbitrary variables etc. You can use a local wrapper to do the same thing, but massive sigh anyways. Also, as a general guideline, similar bullets in any one pattern should all have the same amount of delay, and instead be launched later.
ascent(i in -3..4){
CreateShot01(GetEnemyX,GetEnemyY,4,GetAngleToPlayer+(i*10),AQUA01,10);
}
wait(10);
ascent(i in -7..8){
if( (| (i*5)%10 |) == 5 ){
CreateShot01(GetEnemyX,GetEnemyY,4,GetAngleToPlayer+(i*5),AQUA01,10);
}
}