///shoot_predict_bullet(speed, target_obj, bullet_obj)
/*
Return type: Real (instance id)
*/
function shoot_predict_bullet(argument0, argument1, argument2)
{
var _srp_speed = argument0;
var _srp_target = argument1;
var _srp_inst = argument2;
var en_vx = _srp_target.x – _srp_target.xprevious;
var en_vy = _srp_target.y – _srp_target.yprevious;
var en_v = point_distance(0, 0, en_vx, en_vy);
if (_srp_speed > en_v) {
var theta;
var en_dir = degtorad(point_direction(0, 0, en_vx, en_vy));
var phi = degtorad(point_direction(x, y, _srp_target.x, _srp_target.y));
var t = en_v * cos(en_dir – phi);
// Calculate discriminant
var discriminant = t * t – en_v * en_v + _srp_speed * _srp_speed;
if (discriminant >= 0) {
var xa = –t + sqrt(discriminant);
var vec_en_break_vx = xa * cos(phi);
var vec_en_break_vy = –xa * sin(phi);
var bul_vx = en_vx + vec_en_break_vx;
var bul_vy = en_vy + vec_en_break_vy;
_srp_inst = instance_create(x, y, _srp_inst);
_srp_inst.hspeed = bul_vx;
_srp_inst.vspeed = bul_vy;
} else {
// No valid solution; return no instance
_srp_inst = noone;
}
} else {
// Speed is not sufficient to catch the target
_srp_inst = noone;
}
return _srp_inst;
}