This is the code I use for the homing bullets of my Suika player. They will home in on the enemy closest to them:
task Homing(x, y, v, angle, avmax, damage, penetration){
let tenemy=-1;
let tenemydist=1000;
let enemydist;
let tangle;
let diff;
let n;
let obj=Obj_Create(OBJ_SHOT);
Obj_SetPosition(obj,x,y);
ObjShot_SetGraphic(obj,11);
ObjShot_SetDamage(obj,damage);
ObjShot_SetPenetration(obj,penetration); //
Obj_SetAngle(obj,angle);
Obj_SetSpeed(obj,v);
Obj_SetAlpha(obj,150);
while(Obj_BeDeleted(obj)==false){
angle=Obj_GetAngle(obj);
// avmax=avmax*0.98;
tenemydist=10000;
ascent(i in EnumEnemyBegin..EnumEnemyEnd) { // detects the closest valid target
n=EnumEnemyGetID(i);
enemydist=( (Obj_GetX(obj) - GetEnemyInfo(n, ENEMY_X))^2 + (Obj_GetY(obj) - GetEnemyInfo(n, ENEMY_Y))^2 )^0.5;
if(enemydist<tenemydist){
tenemy=n; tenemydist=enemydist;
}
}
if(tenemydist==10000){ tenemy=-1; }
if(tenemy!=-1){
tangle=atan2( (GetEnemyInfo(tenemy, ENEMY_Y) - Obj_GetY(obj)), (GetEnemyInfo(tenemy, ENEMY_X) - Obj_GetX(obj)));
diff=tangle-angle;
while(diff>180){ diff-=360; } while(diff<-180){ diff+=360; }
if( (|diff|)<avmax){ angle=tangle; }
else{ angle+=avmax*(diff)/(|diff|); }
Obj_SetAngle(obj,angle);
}
yield;
}
}
The line that is commented out of the code is there for making the bullets behave more like the bullets in SA's ReimuB by reducing the amount by which the bullet is homing during each frame, but I don'T think you will need this.