It's a little long, but here's the code example (abridged).
task SpawnRings{
let randoffset = rand(0,360);
let numshiki = [6, 6, 8, 9];
ascent(i in 0..numshiki[diff]){AnchorBullet(randoffset+i*360/numshiki[diff]);}
}
This task runs numshiki instances of the AnchorBullet task.
task AnchorBullet(ang){
let obj = CreateShotA2Alt(GetEnemyX(objBoss), GetEnemyY(objBoss), 3, ang, -0.05, 0, S_LAURAORB_DARKBLUE + S_AO, 0);
let objcount = 0;
ObjShot_SetSpellResist(obj, true);
while(ObjMove_GetSpeed(obj)>0){yield;}
let randoffset = rand(0,360);
let numinring = [5, 6, 8, 9];
let numinline = [2, 3, 5, 6];
ascent(i in 0..numinring[diff]){//greater om higher difficulties.
if(ObjEnemy_GetInfo(objBoss, INFO_LIFE) <= 0){return;}//Default kill to prevent (0,0) spawning
ascent(j in 0..numinline[diff]){
let obj2 = CreateShotA1Alt(GetEnemyX(objBoss), GetEnemyY(objBoss), 0, 0, S_DKSUPP_DARKBLUE, 0);
BulletCommandsA1(obj2, obj, i, numinring[diff], j, randoffset);
}
GS(SFX_WAVE);
objcount++;
yield;
}
loop(150){//wait for last suppository to fire
objcount++;
yield;
}
Obj_Delete(obj);
}
This task creates 'parent' bullets. Each parent bullet runs the double ascent loop to create 'child' bullets.
task BulletCommandsA1(obj, parent, ID, numinring, rowID, offset){
ObjMove_SetDestAtFrame(obj, ObjMove_GetX(parent)+30*cos(ID*360/numinring), ObjMove_GetY(parent)+30*sin(ID*360/numinring), 60);
let objcount = offset;
descent(i in 1..60){
ObjMove_SetDestAtFrame(obj, ObjMove_GetX(parent)+30*cos(ID*360/numinring+objcount), ObjMove_GetY(parent)+30*sin(ID*360/numinring+objcount), i);
objcount++;
yield;
}
loop(90){
ObjMove_SetAngle(obj, ID*360/numinring+objcount);
ObjMove_SetPosition(obj, ObjMove_GetX(parent)+30*cos(ID*360/numinring+objcount), ObjMove_GetY(parent)+30*sin(ID*360/numinring+objcount));
objcount++;
yield;
}
if(ObjEnemy_GetInfo(objBoss, INFO_LIFE) <= 0){return;}//Default kill to prevent (0,0) spawning
ObjMove_SetSpeed(obj, 2+rowID/6);
}
The 'child' bullets constantly set their destination via ObjMove_SetDestAtFrame to be relative to their parent object. This allows them to spawn from anywhere on the screen and move towards their specified parent object. These particular shots rotate around their parent object for a while before flying off.
For what you want to accomplish, you will likely need to specify a parent object (does not need to be visible and does not need to have a hitbox - just a position) and have children objects gravitate towards + move relative to those parent objects.
If you have any further questions, please ask, although it is best to experiment on your own first.