35 #define PLAYER_PRIORITY_MIN 90
36 #define PLAYER_PRIORITY_SHIP 100
37 #define PLAYER_PRIORITY_WING 95
38 #define PLAYER_PRIORITY_SUPPORT_LOW 10
40 #define MAX_GOAL_PRIORITY 200
46 #define PURGE_GOALS_ALL_SHIPS (AI_GOAL_IGNORE | AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP)
47 #define PURGE_GOALS_ONE_SHIP (AI_GOAL_IGNORE_NEW)
53 #define AI_GOAL_ACHIEVABLE 1
54 #define AI_GOAL_NOT_ACHIEVABLE 2
55 #define AI_GOAL_NOT_KNOWN 3
56 #define AI_GOAL_SATISFIED 4
100 return XSTR(
"attack ", 474);
102 return XSTR(
"dock ", 475);
104 return XSTR(
"waypoints", 476);
106 return XSTR(
"waypoints", 476);
108 return XSTR(
"destroy ", 477);
110 return XSTR(
"form on ", 478);
112 return XSTR(
"undock ", 479);
114 return XSTR(
"attack ", 474);
116 return XSTR(
"guard ", 480);
118 return XSTR(
"disable ", 481);
120 return XSTR(
"disarm ", 482);
122 return XSTR(
"guard ", 480);
124 return XSTR(
"evade ", 483);
126 return XSTR(
"rearm ", 484);
222 if(ai_goal_type &
Ship_types[ship_type].ai_valid_goals) {
302 int mode, submode, priority,
i;
307 wingp = &
Wings[wingnum];
326 aigp = &(aip->
goals[j]);
382 int mode, ship_index, wingnum;
391 if ( ship_index == -1 ) {
397 purge_goal = goal_list;
399 int purge_ai_mode, purge_wing;
401 purge_ai_mode = purge_goal->
ai_mode;
417 if ( purge_wing == -1 ) {
420 }
else if ( purge_wing != wingnum )
439 if (ai_wingnum >= 0) {
497 while (loop_count < 100)
502 if (dock_index == -1)
528 if (loop_count >= 100)
541 int shipnum, docker_index, dockee_index;
545 Assertion ( shipnum != -1,
"Couldn't find ai goal's target_name (%s); get a coder!\n", aigp->
target_name );
559 int common_docks = 0;
561 if(aip_type_dock > -1) {
562 aip_type_dock =
Ship_types[aip_type_dock].ai_active_dock;
567 if(aigp_type_dock > -1) {
568 aigp_type_dock =
Ship_types[aigp_type_dock].ai_passive_dock;
573 common_docks = aip_type_dock & aigp_type_dock;
597 if ( docker_index == -1 )
599 if ( dockee_index == -1 )
637 if ( target_name != NULL )
667 int gindex, oldest_index;
677 if (gindex == active_goal)
681 if (oldest_index < 0)
682 oldest_index = gindex;
683 else if (goals[gindex].time < goals[oldest_index].time)
684 oldest_index = gindex;
722 if ( target_name != NULL )
736 aigp = &aip->
goals[empty_index];
765 aigp = &aip->
goals[empty_index];
1022 if ( aigp[
i ].ai_mode == mode &&
1023 ( submode == -1 || aigp[
i ].ai_submode == submode ) &&
1024 ( priority == -1 || aigp[
i ].priority == priority ) )
1046 int goalsubmode = -1;
1051 char* op_text = NULL;
1055 op_text =
CTEXT( node );
1063 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1067 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1075 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1079 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1083 priority = (
CDR(node) >= 0 ) ? atoi(
CTEXT(
CDR( node ) ) ) : -1;
1087 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1092 priority = (
CDR(node) >= 0 ) ? atoi(
CTEXT(
CDR( node ) ) ) : -1;
1096 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1105 priority = (
CDR(node) >= 0 ) ? atoi(
CTEXT(
CDR( node ) ) ) : -1;
1109 priority = (
CDR(node) >= 0 ) ? atoi(
CTEXT(
CDR( node ) ) ) : -1;
1112 priority = (
CDR(node) >= 0 ) ? atoi(
CTEXT(
CDR( node ) ) ) : -1;
1116 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1123 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1130 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1134 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1138 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1142 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1146 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1150 priority = (
CDR(
CDR(node) ) >= 0 ) ? atoi(
CTEXT(
CDR(
CDR( node ) ) ) ) : -1;
1161 if ( goalindex == -1 )
1169 aigp[goalindex].
flags = 0;
1188 if (
Ai_info[
Ships[num].ai_index].active_goal == goalindex )
1261 aigp = &(aip->
goals[gindex]);
1269 switch ( goal_type ) {
1346 aip->
goals[j] = *aigp;
1351 if (j >= MAX_AI_GOALS) {
1357 #define SHIP_STATUS_GONE 1
1358 #define SHIP_STATUS_NOT_ARRIVED 2
1359 #define SHIP_STATUS_ARRIVED 3
1360 #define SHIP_STATUS_UNKNOWN 4
1371 int index = -1, sindex = -1;
1423 if ( aigp->
wp_list == NULL ) {
1426 if ( aigp->
wp_list == NULL ) {
1473 nprintf((
"AI",
"Couldn't find subsystem %d for ship %s\n", aigp->
ai_submode, Ships[sindex].ship_name));
1649 if ( sindex != -1 ) {
1650 modelnum =
Ship_info[Ships[sindex].ship_info_index].model_num;
1670 object *goal_objp = &
Objects[Ships[sindex].objnum];
1680 if (obstacle_objp == NULL)
1684 else if (obstacle_objp != objp)
1696 if (obstacle_objp == NULL)
1700 else if (obstacle_objp != goal_objp)
1731 if ( sindex != -1 ) {
1745 ignored = &
Objects[Ships[sindex].objnum];
1982 int wingnum, shipnum;
1983 int original_signature;
2032 current_goal = &aip->
goals[0];
2052 switch ( current_goal->
ai_mode ) {
2080 if (objp != other_obj) {
2084 mprintf((
"Warning: Ship %s told to guard itself. Goal ignored.\n", Ships[objp->
instance].ship_name));
2115 other_obj = &
Objects[Ships[shipnum].objnum];
2142 other_obj = &
Objects[Ships[shipnum].objnum];
2164 if ( other_obj == NULL ) {
2195 other_obj = &
Objects[Ships[shipnum].objnum];
2229 other_obj = &
Objects[Ships[shipnum].objnum];
2258 other_obj = &
Objects[Ships[shipnum].objnum];
2267 other_obj = &
Objects[Ships[shipnum].objnum];
2269 float dist = 300.0f;
2284 other_obj = &
Objects[Ships[shipnum].objnum];
2297 int i,
mode, flag, dummy;
2353 if (!
stricmp(goals[i].target_name, old_name)) {
2354 if (*new_name ==
'<')
2419 if (!
stricmp(goals[i].target_name, name))
char Parse_names[MAX_SHIPS+MAX_WINGS][NAME_LENGTH]
model_subsystem * system_info
weapon Weapons[MAX_WEAPONS]
#define STI_AI_PROTECTED_ON_CRIPPLE
void ai_mission_goal_complete(ai_info *aip)
#define AIGF_SUBSYS_NEEDS_FIXUP
void ai_do_stay_near(object *objp, object *other_obj, float dist)
#define OP_AI_FORM_ON_WING
void ai_attack_object(object *attacker, object *attacked, ship_subsys *ssp)
#define PLAYER_PRIORITY_SUPPORT_LOW
char * Mode_text[MAX_AI_BEHAVIORS]
#define LOG_SHIP_SUBSYS_DESTROYED
void ai_add_ship_goal_player(int type, int mode, int submode, char *shipname, ai_info *aip)
#define SF2_NO_SUBSPACE_DRIVE
void ai_form_on_wing(object *objp, object *goal_objp)
void ai_add_wing_goal_player(int type, int mode, int submode, char *shipname, int wingnum)
#define AI_GOAL_CHASE_WING
int mission_do_departure(object *objp, bool goal_is_to_warp)
#define AI_GOAL_WAYPOINTS
void ai_clear_wing_goals(int wingnum)
void ai_ignore_object(object *ignorer, object *ignored, int ignore_new)
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define AI_GOAL_STAY_NEAR_SHIP
#define AIGF_GOAL_ON_HOLD
#define AI_GOAL_CHASE_ANY
void ai_add_goal_ship_internal(ai_info *aip, int goal_type, char *name, int docker_point, int dockee_point, int immediate)
#define LOG_WING_DEPARTED
const char * Ai_goal_text(int goal)
int ai_goal_num(ai_goal *goals)
int ai_goal_find_empty_slot(ai_goal *goals, int active_goal)
#define LOG_SHIP_DEPARTED
object * dock_find_object_at_dockpoint(object *objp, int dockpoint)
int ai_goal_find_dockpoint(int shipnum, int dock_type)
#define AIGF_GOALS_PURGED
bool dock_check_find_direct_docked_object(object *objp, object *other_objp)
ai_info Ai_info[MAX_AI_INFO]
int ai_remove_goal_sexp_sub(int sexp, ai_goal *aigp)
#define Assertion(expr, msg,...)
#define END_OF_LIST(head)
#define SHIP_STATUS_ARRIVED
#define AI_GOAL_DISARM_SHIP
void ai_stay_still(object *still_objp, vec3d *view_pos)
int ship_find_exited_ship_by_name(char *name)
#define DOCK_TYPE_GENERIC
int query_referenced_in_ai_goals(ai_goal *goals, int type, const char *name)
void ai_clear_ship_goals(ai_info *aip)
char dockee_point[NAME_LENGTH]
flag_def_list Dock_type_names[]
#define OP_AI_DISABLE_SHIP
void ai_add_goal_sub_player(int type, int mode, int submode, char *target_name, ai_goal *aigp)
void ai_rearm_repair(object *objp, int docker_index, object *goal_objp, int dockee_index)
#define AIF_FORMATION_OBJECT
void ai_start_waypoints(object *objp, waypoint_list *wp_list, int wp_flags)
#define AIG_TYPE_PLAYER_SHIP
#define PURGE_GOALS_ONE_SHIP
#define AI_ACTIVE_GOAL_DYNAMIC
int object_is_docked(object *objp)
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
void send_ai_info_update_packet(object *objp, char what, object *other_objp)
#define DEPART_AT_DOCK_BAY
void ai_add_goal_sub_sexp(int sexp, int type, ai_goal *aigp, char *actor_name)
int model_find_dock_index(int modelnum, int dock_type, int index_to_start_at=0)
p_object * mission_parse_get_arrival_ship(const char *name)
Returns the parse object on the ship arrival list associated with the given name. ...
#define AI_GOAL_NOT_KNOWN
ship_subsys * ship_get_indexed_subsys(ship *sp, int index, vec3d *attacker_pos)
int mission_log_get_time(int type, char *pname, char *sname, fix *time)
#define LOG_WING_DESTROYED
void ai_remove_wing_goal_sexp(int sexp, int wingnum)
#define LOG_SHIP_DISABLED
void ai_add_goal_wing_internal(wing *wingp, int goal_type, char *name, int immediate)
void ai_attack_wing(object *attacker, int wingnum)
ai_goal_list Ai_goal_names[]
SCP_vector< int > ai_cripple_ignores
GLboolean GLboolean GLboolean GLboolean a
void ai_dock_with_object(object *docker, int docker_index, object *dockee, int dockee_index, int dock_type)
#define MAX_STARTING_WINGS
ai_goal goals[MAX_AI_GOALS]
char Ai_dock_names[MAX_AI_DOCK_NAMES][NAME_LENGTH]
void ai_do_default_behavior(object *obj)
#define AI_GOAL_STAY_STILL
#define AIG_TYPE_PLAYER_WING
void ai_post_process_mission()
object * dock_get_first_docked_object(object *objp)
int ai_goal_priority_compare(const void *a, const void *b)
int ai_query_goal_valid(int ship, int ai_goal_type)
void insertion_sort(void *array_base, size_t array_size, size_t element_size, int(*fncompare)(const void *, const void *))
#define SHIP_STATUS_NOT_ARRIVED
#define REF_TYPE_WAYPOINT
int ai_find_goal_index(ai_goal *aigp, int mode, int submode, int priority)
#define AI_GOAL_EVADE_SHIP
void prioritize_goals(ai_info *aip)
void validate_mission_goals(int objnum, ai_info *aip)
#define OP_AI_KEEP_SAFE_DISTANCE
#define AIF_AWAITING_REPAIR
void ai_update_goal_references(ai_goal *goals, int type, const char *old_name, const char *new_name)
#define AI_GOAL_IGNORE_NEW
#define AI_GOAL_FLY_TO_SHIP
bool ship_useful_for_departure(int shipnum, int path_mask)
object Objects[MAX_OBJECTS]
#define AI_GOAL_PLAY_DEAD
const char * XSTR(const char *str, int index)
#define AI_GOAL_WAYPOINTS_ONCE
#define LOG_SHIP_DESTROYED
char * ai_get_goal_target_name(const char *name, int *index)
void ai_start_fly_to_ship(object *objp, int shipnum)
#define OP_AI_WAYPOINTS_ONCE
void ai_add_ship_goal_sexp(int sexp, int type, ai_info *aip)
#define AI_GOAL_SATISFIED
#define AI_GOAL_GUARD_WING
void ai_goal_fixup_dockpoints(ai_info *aip, ai_goal *aigp)
#define MAX_AI_DOCK_NAMES
void ai_goal_purge_all_invalid_goals(ai_goal *aigp)
int wing_name_lookup(const char *name, int ignore_count)
int Starting_wings[MAX_STARTING_WINGS]
#define SHIP_STATUS_UNKNOWN
#define AIF_BEING_REPAIRED
int is_sexp_true(int cur_node, int referenced_node)
GLuint const GLchar * name
#define AIGF_DOCKER_INDEX_VALID
GLboolean GLboolean GLboolean b
int model_find_dock_name_index(int modelnum, char *name)
void ai_goal_purge_invalid_goals(ai_goal *aigp, ai_goal *goal_list, ai_info *aip, int ai_wingnum)
#define OP_AI_DESTROY_SUBSYS
waypoint_list * find_matching_waypoint_list(const char *name)
char * ai_add_dock_name(const char *str)
#define AI_GOAL_KEEP_SAFE_DISTANCE
#define AIGF_DOCK_INDEXES_VALID
#define AI_GOAL_DISABLE_SHIP
void ai_maybe_add_form_goal(wing *wingp)
#define PLAYER_PRIORITY_MIN
waypoint_list * find_waypoint_list_at_index(int index)
void ai_add_ship_goal_scripting(int mode, int submode, int priority, char *shipname, ai_info *aip)
#define PLAYER_PRIORITY_WING
void ai_mission_wing_goal_complete(int wingnum, ai_goal *remove_goalp)
char subobj_name[MAX_NAME_LEN]
#define MULTIPLAYER_MASTER
void ai_add_wing_goal_sexp(int sexp, int type, int wingnum)
SCP_vector< ship_info > Ship_info
#define AI_GOAL_CHASE_WEAPON
#define OP_AI_STAY_NEAR_SHIP
int get_operator_const(const char *token)
void ai_add_goal_sub_scripting(int type, int mode, int submode, int priority, char *target_name, ai_goal *aigp)
void ai_process_mission_orders(int objnum, ai_info *aip)
void ai_set_guard_wing(object *objp, int wingnum)
#define AI_GOAL_REARM_REPAIR
int ship_index[MAX_SHIPS_PER_WING]
#define OP_AI_DISARM_SHIP
int ship_get_subsys_index(ship *sp, char *ss_name, int error_bypass)
#define AIGF_TARGET_OWN_TEAM
int ship_name_lookup(const char *name, int inc_players)
#define AIGF_GOAL_OVERRIDE
#define AIGF_DOCKEE_INDEX_VALID
#define AI_GOAL_DESTROY_SUBSYSTEM
#define PURGE_GOALS_ALL_SHIPS
void ai_evade_object(object *evader, object *evaded)
int ai_mission_goal_achievable(int objnum, ai_goal *aigp)
int ai_set_attack_subsystem(object *objp, int subnum)
void ai_copy_mission_wing_goal(ai_goal *aigp, ai_info *aip)
void ai_do_safety(object *objp)
#define AI_GOAL_FORM_ON_WING
void ai_set_guard_object(object *objp, object *other_objp)
#define LOG_SHIP_DISARMED
char ship_name[NAME_LENGTH]
char docker_point[NAME_LENGTH]
#define PLAYER_PRIORITY_SHIP
SCP_vector< ship_type_info > Ship_types
#define LOG_SELF_DESTRUCTED
#define AI_GOAL_ACHIEVABLE
#define MAX_GOAL_PRIORITY
ai_goal ai_goals[MAX_AI_GOALS]
#define AI_GOAL_NOT_ACHIEVABLE
void ai_remove_ship_goal(ai_info *aip, int index)