21 #define SWARM_DIST_OFFSET 2.0f // distance swarm missile should vary from original path
22 #define SWARM_CONE_LENGTH 10000.0f // used to pick a target point far in the distance
23 #define SWARM_CHANGE_DIR_TIME 400 // time to force change in direction of swarm missile
24 #define SWARM_ANGLE_CHANGE (4*PI/180) // in rad
31 #define SWARM_TIME_VARIANCE 100 // max time variance when deciding when to change swarm missile course
33 #define SWARM_DIST_STOP_SWARMING 300
35 #define TURRET_SWARM_VALIDITY_CHECKTIME 5000 // number of ms between checks on turret_swam_info checks
37 #define SWARM_USED (1<<0)
38 #define SWARM_POSITIVE_PATH (1<<1)
59 swarmp = &Swarm_missiles[
i];
66 tswarmp = &Turret_swarm_info[
i];
94 int weapon_info_index;
142 swarmp = &Swarm_missiles[
i];
147 if ( i >= MAX_SWARM_MISSILES ) {
148 nprintf((
"Warning",
"No more swarm missiles are available\n"));
170 swarmp = &Swarm_missiles[
i];
191 float vel, target_dist, radius, missile_speed, missile_dist;
243 missile_speed = pi->
speed;
244 missile_dist = missile_speed * swarmp->
change_time/1000.0f;
264 missile_speed = pi->
speed;
265 missile_dist = missile_speed * swarmp->
change_time/1000.0f;
280 goto swarm_new_target_calced;
284 vec3d rvec_component, uvec_component;
355 goto swarm_new_target_calced;
362 swarm_new_target_calced:
380 tswarmp = &Turret_swarm_info[
i];
385 if ( i >= MAX_TURRET_SWARM_INFO ) {
386 nprintf((
"Warning",
"No more turret swarm info slots are available\n"));
413 tswarmp = &Turret_swarm_info[
i];
426 object *parent_obj, *target_obj;
441 if((parent_objnum < 0) || (parent_objnum >=
MAX_OBJECTS)){
444 parent_obj = &
Objects[parent_objnum];
461 if (tsi_index == -1) {
466 tsi = &Turret_swarm_info[tsi_index];
470 mprintf((
"Overlapping turret swarm firing intervals\n"));
473 for (old_s = 0; old_s < (
MAX_TFP - 1); old_s++)
527 object *parent_obj, *target_obj;
528 int num_turret_swarm_turrets_left;
548 for (k = 0; k < swarms_per_turret; k++)
551 num_turret_swarm_turrets_left--;
552 Assert(num_turret_swarm_turrets_left >= 0);
556 tsi = &Turret_swarm_info[turret_tsi];
615 for (k = 0; k < (
MAX_TFP - 1); k++)
617 for (j = (k + 1); j <
MAX_TFP; j++)
628 Assert(num_turret_swarm_turrets_left == 0);
645 tswarmp = &Turret_swarm_info[
i];
ship_subsys * target_subsys
void turret_swarm_fire_from_turret(turret_swarm_info *tsi)
int num_swarm_missiles_to_fire
int timestamp(int delta_ms)
model_subsystem * system_info
weapon Weapons[MAX_WEAPONS]
#define SWARM_CONE_LENGTH
EModelAnimationPosition turret_animation_position
float vm_vec_mag_quick(const vec3d *v)
#define SWARM_DIST_STOP_SWARMING
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
#define MSS_FLAG2_TURRET_USE_AMMO
weapon_info Weapon_info[MAX_WEAPON_TYPES]
float vm_vec_mag(const vec3d *v)
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define WEAPON_INFO_INDEX(wip)
#define END_OF_LIST(head)
void turret_swarm_set_up_info(int parent_objnum, ship_subsys *turret, weapon_info *wip, int weapon_num)
#define SWARM_POSITIVE_PATH
int ship_fire_secondary(object *obj, int allow_swarm)
int current_secondary_bank
int Turret_swarm_validity_next_check_time
void turret_swarm_maybe_fire_missile(int shipnum)
void vm_vec_add2(vec3d *dest, const vec3d *src)
#define SWARM_CHANGE_DIR_TIME
struct matrix::@228::@230 vec
void swarm_maybe_fire_missile(int shipnum)
turret_swarm_info Turret_swarm_info[MAX_TURRET_SWARM_INFO]
int num_turret_swarm_info
int turret_swarm_create()
int secondary_bank_weapons[MAX_SHIP_SECONDARY_BANKS]
int secondary_bank_ammo[MAX_SHIP_SECONDARY_BANKS]
object Objects[MAX_OBJECTS]
void vm_vec_copy_scale(vec3d *dest, const vec3d *src, float s)
void swarm_update_direction(object *objp, float frametime)
int turret_animation_done_time
#define SWARM_TIME_VARIANCE
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
#define MAX_SWARM_MISSILES
float frand()
Return random value in range 0.0..1.0- (1.0- means the closest number less than 1.0)
swarm_info Swarm_missiles[MAX_SWARM_MISSILES]
#define TURRET_SWARM_VALIDITY_CHECKTIME
ship_subsys * targeted_subsys
char subobj_name[MAX_NAME_LEN]
void ai_turn_towards_vector(vec3d *dest, object *objp, float frametime, float turn_time, vec3d *slide_vec, vec3d *rel_pos, float bank_override, int flags, vec3d *rvec=NULL, int sexp_flags=0)
#define SWARM_DIST_OFFSET
#define timestamp_elapsed(stamp)
void turret_swarm_check_validity()
int turret_swarm_info_index[MAX_TFP]
void turret_swarm_delete(int i)
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
char ship_name[NAME_LENGTH]
#define MAX_TURRET_SWARM_INFO