136 strcat(NavName,
":");
138 strcat(NavName, strtmp);
178 object *other_objp = &
Objects[so->objnum];
239 "objp does not have a valid pointer to a ship. Pointer is %d, which is smaller than 0 or bigger than %d",
247 "Ship '%s' does not have a valid pointer to a ship class. Pointer is %d, which is smaller than 0 or bigger than %d",
284 if ( Autopilot_flight_leader == NULL ) {
298 int i,j, wcount=1, tc_factor=1;
299 float speed_cap = 1000000.0;
301 bool capshipPresent =
false;
302 int capship_counts[3];
303 capship_counts[0] = 0;
304 capship_counts[1] = 0;
305 capship_counts[2] = 0;
307 int capship_placed[3];
308 capship_placed[0] = 0;
309 capship_placed[1] = 0;
310 capship_placed[2] = 0;
312 float capship_spreads[3];
313 capship_spreads[0] = 0.0f;
314 capship_spreads[1] = 0.0f;
315 capship_spreads[2] = 0.0f;
320 autopilot_wings.clear();
324 memset(&zero, 0,
sizeof(
vec3d));
336 if (
Ships[i].objnum != -1 &&
349 speed_cap = 0.90f * speed_cap;
351 if ( speed_cap < 1.0
f ) {
355 "This is normally caused by a ship that has nav-carry-status set, but cannot move itself (like a Cargo container).\n"
356 "Speed cap has been set to 1.0 m/s.",
369 if (
Ships[i].objnum != -1 &&
379 capshipPresent =
true;
381 capIndexes.push_back(i);
387 if (capship_spreads[0] <
Objects[
Ships[i].objnum].radius)
393 if (capship_spreads[1] <
Objects[
Ships[i].objnum].radius)
399 if (capship_spreads[2] <
Objects[
Ships[i].objnum].radius)
435 if (leader_objp != &
Objects[Ships[i].objnum])
443 j = 1+
int( (
float)floor(
double(wcount-1)/2.0) );
451 vm_vec_add(&goal_point, &Autopilot_flight_leader->
pos, &perp);
460 vm_vec_add(&goal_point, &Autopilot_flight_leader->
pos, &perp);
463 autopilot_wings[wingnum] = wcount;
539 if (
Ships[i].objnum != -1)
584 switch (capship_placed[0] % 3)
602 vm_vec_scale(&right, (1+((
float)floor((
float)capship_placed[0]/3))));
603 vm_vec_scale(&up, -(1+((
float)floor((
float)capship_placed[0]/3))));
617 switch (capship_placed[1] % 3)
635 vm_vec_scale(&right, (1+((
float)floor((
float)capship_placed[1]/3))));
636 vm_vec_scale(&up, (1+((
float)floor((
float)capship_placed[1]/3))));
654 switch (capship_placed[2] % 6)
690 vm_vec_scale(&right, 2*(1+((
float)floor((
float)capship_placed[2]/3))));
691 vm_vec_scale(&front, 2*(1+((
float)floor((
float)capship_placed[2]/3))));
696 if ( (capship_placed[2] % 2) == 0)
726 if (ftemp >= 2.0
f && ftemp < 4.0
f)
728 else if (ftemp >= 4.0
f && ftemp < 8.0
f)
730 else if (ftemp >= 8.0
f)
751 if (capship_placed[0] == 0)
792 if (capship_placed[0] < 2)
802 if (capship_placed[0] < 1)
812 perp = Autopilot_flight_leader->
orient.
vec.rvec;
873 Autopilot_flight_leader = NULL;
893 char *goal_name = NULL;
914 if (
Ships[i].objnum != -1 &&
938 if (
Ships[i].wingnum != -1)
987 static camid nav_camera;
1003 vec3d targetPos, tpos=Autopilot_flight_leader->
pos,
pos, velocity;
1019 vm_vec_sub(&targetPos, &tpos, &Autopilot_flight_leader->
pos);
1030 vm_vec_add(&cameraPos, &cameraPos, &targetPos);
1043 if (Ships[
i].objnum != -1
1067 static unsigned int last_update = 0;
1128 if ((Navs[i].
flags &
NP_SHIP) && (Navs[i].target_obj != NULL))
1130 if (((
ship*)Navs[i].target_obj)->objnum == -1)
1142 if (Navs[i].target_obj != NULL)
1161 else if (dstfrm_start >= (2000*
ramp_bias))
1163 else if (dstfrm_start >= (1600*
ramp_bias))
1165 else if (dstfrm_start >= (1200*
ramp_bias))
1167 else if (dstfrm_start >= (800*
ramp_bias))
1169 else if (dstfrm_start >= (400*
ramp_bias))
1202 Ships[
i].flags2 &= ~SF2_NAVPOINT_NEEDSLINK;
1231 if (msg[0] !=
'\0' && strcmp(msg,
"none"))
1235 if ((snd != NULL) && (snd[0] !=
'\0' && !strcmp(snd,
"none")))
1246 if (msg[0] !=
'\0' && strcmp(msg,
"none"))
1278 if (filename == NULL)
1292 if (
optional_string(
"$Interrupt autopilot if enemy within distance:"))
1297 if (
optional_string(
"$Interrupt autopilot if asteroid within distance:"))
1315 char *msg_tags[] = {
"$No Nav Selected:",
"$Gliding:",
1316 "$Too Close:",
"$Hostiles:",
"$Linked:",
"$Hazard:",
1317 "$Support Present:",
"$Support Working:" };
1334 mprintf((
"TABLES: Unable to parse '%s'! Error message = %s.\n", (filename) ? filename :
"<default autopilot.tbl>", e.what()));
1346 if (!
stricmp(Navs[
i].m_NavName, Nav))
1371 Navs[nav] = Navs[nav+1];
1393 if (Navs[i].flags == 0)
1439 if (Navs[i].flags == 0)
1488 flags = Navs[nav].
flags;
1504 Navs[nav].
flags |= flag;
1521 Navs[nav].
flags &= ~flag;
1578 if (!
stricmp(Navs[
i].m_NavName, Nav))
void autopilot_ai_waypoint_goal_fixup(ai_goal *aigp)
int timestamp(int delta_ms)
camid cam_create(char *n_name, vec3d *n_pos, vec3d *n_norm, object *n_object, int n_object_host_submodel)
unsigned int DistanceTo(char *nav)
bool CanAutopilot(vec3d targetPos, bool send_msg)
int Cmdline_old_collision_sys
void lock_time_compression(bool is_locked)
int obj_team(object *objp)
bool Nav_UnSet_Hidden(char *Nav)
int ai_find_goal_index(ai_goal *aigp, int mode, int submode=-1, int priority=-1)
float vm_vec_mag(const vec3d *v)
void ai_add_ship_goal_player(int type, int mode, int submode, char *shipname, ai_info *aip)
void obj_all_collisions_retime(int checkdly)
asteroid Asteroids[MAX_ASTEROIDS]
void ai_add_wing_goal_player(int type, int mode, int submode, char *shipname, int wingnum)
#define MISSION_FLAG_USE_AP_CINEMATICS
void ai_clear_wing_goals(int wingnum)
bool IsVisited(char *nav)
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
bool AddNav_Waypoint(char *Nav, char *WP_Path, int node, int flags)
int AutopilotMinEnemyDistance
void set_position(vec3d *in_position=NULL, float in_translation_time=0.0f, float in_translation_acceleration_time=0.0f, float in_translation_deceleration_time=0.0f, float in_end_velocity=0.0f)
struct vec3d::@225::@227 xyz
bool cam_set_camera(camid cid)
const char * defaults_get_file(const char *filename)
bool Nav_Set_NoAccess(char *Nav)
ai_info Ai_info[MAX_AI_INFO]
#define Assertion(expr, msg,...)
#define END_OF_LIST(head)
#define SF2_NAVPOINT_CARRY
void nav_warp(bool prewarp=false)
#define NP_MSG_FAIL_SUPPORT_PRESENT
#define NP_MSG_MISC_LINKED
GLenum GLuint GLenum GLsizei const GLchar * message
void ai_clear_ship_goals(ai_info *aip)
bool Nav_UnSet_NoAccess(char *Nav)
#define AIF_FORMATION_OBJECT
#define AIG_TYPE_PLAYER_SHIP
bool Nav_Set_Visited(char *Nav)
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
matrix * vm_vector_2_matrix(matrix *m, const vec3d *fvec, const vec3d *uvec, const vec3d *rvec)
#define NP_MSG_FAIL_NOSEL
struct matrix::@228::@230 vec
void vm_vec_scale(vec3d *dest, float s)
int cf_exists_full(const char *filename, int dir_type)
bool Nav_Alt_Flags(char *Nav, int flags)
bool object_get_gliding(object *objp)
ai_goal goals[MAX_AI_GOALS]
bool AddNav_Ship(char *Nav, char *TargetName, int flags)
void stuff_string(char *outstr, int type, int len, char *terminators)
int AutopilotMinAsteroidDistance
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
int Cmdline_autopilot_interruptable
void set_time_compression(float multiplier, float change_time)
bool Nav_Set_Flag(char *Nav, int flag)
int required_string(const char *pstr)
#define AIG_TYPE_PLAYER_WING
SCP_map< int, int > autopilot_wings
int optional_string(const char *pstr)
void SelectNav(char *Nav)
void parse_autopilot_table(char *filename)
void read_file_text(const char *filename, int mode, char *processed_text, char *raw_text)
void message_training_queue(char *text, int timestamp, int length)
int iff_x_attacks_y(int team_x, int team_y)
#define AI_GOAL_FLY_TO_SHIP
object Objects[MAX_OBJECTS]
camera * nav_get_set_camera()
void read_file_text_from_array(const char *array, char *processed_text, char *raw_text)
#define AI_GOAL_WAYPOINTS_ONCE
bool change_message(char *name, char *message, int persona_index, int multi_team)
void stuff_boolean(int *i, bool a_to_eol)
bool Nav_UnSet_Flag(char *Nav, int flag)
int ship_find_repair_ship(object *requester_obj, object **ship_we_found)
void vm_vec_copy_scale(vec3d *dest, const vec3d *src, float s)
#define NP_MSG_FAIL_SUPPORT_WORKING
void reset_parse(char *text)
bool Nav_UnSet_Visited(char *Nav)
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
NavMessage NavMsgs[NP_NUM_MESSAGES]
#define SF2_PRIMARIES_LOCKED
void audiostream_close_file(int i, int fade)
void send_autopilot_msg(char *msg, char *snd)
waypoint_list * find_matching_waypoint_list(const char *name)
float vm_vec_dist_quick(const vec3d *v0, const vec3d *v1)
class camera * getCamera()
SCP_vector< ship_info > Ship_info
float Master_event_music_volume
object * Autopilot_flight_leader
#define NP_MSG_FAIL_HAZARD
int Nav_Get_Flags(char *Nav)
#define OF_SHOULD_BE_DEAD
void audiostream_play(int i, float volume, int looping)
#define NP_MSG_FAIL_TOCLOSE
#define AI_GOAL_REARM_REPAIR
int audiostream_open(const char *filename, int type)
object * get_wing_leader(int wingnum)
waypoint * find_waypoint_at_index(waypoint_list *list, int index)
bool Nav_Set_Hidden(char *Nav)
#define SF2_NAVPOINT_NEEDSLINK
bool DelNavPoint(char *Nav)
int get_wing_index(object *objp, int wingnum)
void obj_collide_retime_cached_pairs(int checkdly)
#define SF2_SECONDARIES_LOCKED
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
bool LockWeaponsDuringAutopilot
NavPoint Navs[MAX_NAVPOINTS]
char ship_name[NAME_LENGTH]
void set_rotation_facing(vec3d *in_target, float in_rotation_time=0.0f, float in_rotation_acceleration_time=0.0f, float in_rotation_deceleration_time=0.0f)
#define NP_MSG_FAIL_HOSTILES
void get_absolute_wing_pos_autopilot(vec3d *result_pos, object *leader_objp, int wing_index, int formation_object_flag)
ai_goal ai_goals[MAX_AI_GOALS]
float vm_vec_normalize(vec3d *v)
#define NP_MSG_FAIL_GLIDING
void ai_remove_ship_goal(ai_info *aip, int index)
void send_autopilot_msgID(int msgid)