117 #define SHIP_WARP_TIME 5.0f // how many seconds it takes for ship to warp in
133 #define MIN_SUBSYS_STATUS_SIZE 25
214 "Fighter",
"Fighter Wing",
"Cargo",
"Cargo Wing",
"Largeship",
215 "Largeship Wing",
"Capital",
"Planet",
"Asteroid Field",
"Waypoint",
216 "Support Ship",
"Freighter(no cargo)",
"Freighter(has cargo)",
217 "Freighter Wing(no cargo)",
"Freighter Wing(has cargo)",
"Installation",
218 "Bomber",
"Bomber Wing",
"Cruiser",
"Cruiser Wing",
"Unknown",
"Unknown Wing",
219 "Player Fighter",
"Player Fighter Wing",
"Player Bomber",
"Player Bomber Wing",
220 "Knossos Device",
"Transport Wing",
"Corvette",
"Gas Miner",
"Awacs",
"Supercap",
"Sentry Gun",
"Jump Node",
"Transport"
224 "Shields Critical",
"Engines Damaged",
"Fully Operational",
228 "Damaged",
"Disabled",
"Corroded",
232 "Weapons",
"Engines",
"Cable TV",
237 "Hyperspace",
"Near Ship",
"In front of ship",
"Docking Bay",
241 "Hyperspace",
"Docking Bay",
245 "Primary",
"Secondary",
"Bonus",
254 "Single Player Only",
256 "Single/Multi Player",
273 "hidden-from-sensors",
280 "laser-protect-ship",
281 "missile-protect-ship",
286 "friendly-stealth-invisible",
287 "don't-collide-invisible",
294 "affected-by-gravity",
295 "toggle-subsystem-scanning",
296 "targetable-as-bomb",
297 "no-builtin-messages",
299 "secondaries-locked",
301 "always-death-scream",
304 "set-class-dynamically",
306 "afterburners-locked",
315 "no-disabled-self-destruct",
345 #define ARRIVAL_TIMESTAMP 2000 // every 2 seconds
346 #define DEPARTURE_TIMESTAMP 2200 // every 2.2 seconds -- just to be a little different
351 #define MISSION_CHECKSUM_SIZE (NAME_LENGTH + NAME_LENGTH + 4 + DATE_TIME_LENGTH + DATE_TIME_LENGTH)
354 #define ARRIVAL_MUSIC_MIN_SEPARATION 60000
355 #define ARRIVAL_MESSAGE_MIN_SEPARATION 30000
357 #define ARRIVAL_MESSAGE_DELAY_MIN 2000
358 #define ARRIVAL_MESSAGE_DELAY_MAX 3000
360 static int Allow_arrival_music_timestamp;
361 static int Allow_arrival_message_timestamp;
362 static int Arrival_message_delay_timestamp;
365 static int Allow_arrival_music_timestamp_m[2];
366 static int Allow_arrival_message_timestamp_m[2];
367 static int Arrival_message_delay_timestamp_m[2];
389 static bool Warned_about_team_out_of_range;
405 void parse_custom_bitmap(const
char *expected_string_640, const
char *expected_string_1024,
char *string_field_640,
char *string_field_1024)
407 int found640 = 0, found1024 = 0;
408 strcpy(string_field_640,
"");
409 strcpy(string_field_1024,
"");
426 Warning(
LOCATION,
"Mission: found an entry for %s but not a corresponding entry for %s!", expected_string_640, expected_string_1024);
430 Warning(
LOCATION,
"Mission: found an entry for %s but not a corresponding entry for %s!", expected_string_1024, expected_string_640);
606 if ((it->flags &
SIF_SUPPORT) && (it->species == species))
628 if (temp <= 100.0f && temp >= 0.0
f) {
639 if (temp <= 100.0f && temp >= 0.0
f) {
769 char preset[65] = {
'\0' };
774 if (preset_id >= 0) {
843 ptr = &Team_data[nt];
858 for (i=0; i<total; i += 4) {
868 if (list[i+1] == -1) {
878 if (list[i+3] == -1) {
900 for (i = 0; i < static_cast<int>(
Ship_info.size()); i++ ) {
906 Assertion( i < static_cast<int>(
Ship_info.size()),
"Mission: %s: Could not find a valid default ship.\n", pm->
name );
921 for (i = 0; i < total; i += 4) {
938 if (list2[i+1] == -1) {
946 if (list2[i+3] == -1) {
968 for (i = 0; i < num_weapons; i++)
973 if ( nt != Num_teams )
974 Error(
LOCATION,
"Not enough ship/weapon pools for mission. There are %d teams and only %d pools.", Num_teams, nt);
989 "$Fiction Viewer Cutscene:",
990 "$Command Brief Cutscene:",
991 "$Briefing Cutscene:",
992 "$Pre-game Cutscene:",
993 "$Debriefing Cutscene:",
994 "$Campaign End Cutscene:");
1166 if (flags & MPF_IMPORT_FSM)
1170 goto done_event_music;
1180 goto done_event_music;
1185 ch = strchr(temp,
':');
1195 goto done_event_music;
1210 goto done_briefing_music;
1220 goto done_briefing_music;
1225 goto done_briefing_music;
1232 done_briefing_music:
1270 bool fiction_viewer_loaded =
false;
1303 fiction_viewer_loaded =
true;
1363 int nt,
i, j, stage_num = 0, icon_num = 0;
1393 bs = &bp->
stages[stage_num++];
1453 static char *temp_team_names[
MAX_IFFS];
1455 temp_team_names[i] =
Iff_info[i].iff_name;
1461 bi = &bs->
icons[icon_num++];
1487 if (flags & MPF_IMPORT_FSM)
1524 for (i=0; i<stage_num-1; i++)
1572 if ( nt != Num_teams )
1573 Error(
LOCATION,
"Not enough briefings in mission file. There are %d teams and only %d briefings.", Num_teams, nt );
1606 dbs = &db->
stages[stage_num++];
1620 if ( nt != Num_teams )
1621 Error(
LOCATION,
"Not enough debriefings for mission. There are %d teams and only %d debriefings;\n", Num_teams, nt );
1628 object *knossos_objp = NULL;
1636 object *ship_objp = &
Objects[so->objnum];
1643 knossos_objp = ship_objp;
1649 if (knossos_objp == NULL)
1660 float desired_dist = -pm->
mins.
xyz.z;
1677 int dockpoint, parent_dockpoint;
1678 char *dockpoint_name, *parent_dockpoint_name;
1679 object *
objp, *parent_objp;
1686 if (!objp || !parent_objp)
1697 if (!dockpoint_name || !parent_dockpoint_name)
1708 if ((dockpoint < 0) || (parent_dockpoint < 0))
1715 nprintf((
"AI",
"Initially docked: %s to parent %s\n", Ships[objp->
instance].ship_name, Ships[parent_objp->
instance].ship_name));
1809 int i, j, k, objnum, shipnum;
1810 int anchor_objnum = -1;
1828 shipp = &
Ships[shipnum];
2062 int default_orders, remaining_orders;
2066 if (remaining_orders)
2068 Warning(
LOCATION,
"Ship %s has orders which it will accept that are\nnot part of default orders accepted.\n\nPlease reedit this ship and change the orders again\n", shipp->
ship_name);
2167 "Primary weapon cargo size <= 0. Ship (%s) Subsystem (%s) Bank (%i) Weapon (%s)",
2184 "Secondary weapon cargo size <= 0. Ship (%s) Subsystem (%s) Bank (%i) Weapon (%s)",
2234 if ((100.0
f - sssp->
percent) < 0.5)
2260 "Primary weapon cargo size <= 0. Ship (%s) Subsystem (%s) Bank (%i) Weapon (%s)",
2274 "Secondary weapon cargo size <= 0. Ship (%s) Subsystem (%s) Bank (%i) Weapon (%s)",
2308 int max_allowed_sparks, num_sparks, iLoop;
2336 if (num_sparks > max_allowed_sparks)
2337 num_sparks = max_allowed_sparks;
2339 for (iLoop = 0; iLoop < num_sparks; iLoop++)
2410 if (anchor_objnum >= 0)
2451 Error(
LOCATION,
"Wing %s was created from docked ships but somehow has more than one wave!", wingp->
name);
2477 aip->
wing = wingnum;
2510 Warning(
LOCATION,
"Ship %s is a reinforcement unit but is a member of a wing. Ignoring reinforcement flag.", shipp->
ship_name);
2520 Warning(
LOCATION,
"The parser found a ship with both the \"force-shields-on\" and \"no-shields\" flags; this is inconsistent!");
2522 if (parse_flags & P_OF_NO_SHIELDS)
2630 if (parse_flags2 & P2_OF_FORCE_SHIELDS_ON)
2663 Assertion(!(p_objp->
use_special_explosion),
"Mission appears to be using both the new and old method of special explosions for %s. Old method values used", p_objp->
name);
2666 for ( i = variable_index; i < (variable_index +
BLOCK_EXP_SIZE); i++ ) {
2668 Warning (
LOCATION,
"%s is using the old special explosions method but does not appear to have variables for all the values", p_objp->
name);
2691 for ( i = variable_index; i < (variable_index +
BLOCK_HIT_SIZE); i++ ) {
2693 Warning (
LOCATION,
"%s is using the old special hitpoints method but does not appear to have variables for all the values", p_objp->
name);
2703 : next(NULL), prev(NULL), dock_list(NULL), created_object(NULL)
2731 p_objp->
next = NULL;
2732 p_objp->
prev = NULL;
2744 Warning(
LOCATION,
"Ship \"%s\" has an invalid ship type (ships.tbl probably changed). Making it type 0\n", p_objp->
name);
2747 mprintf((
"MISSIONS: Ship \"%s\" has an invalid ship type (ships.tbl probably changed). Making it type 0\n", p_objp->
name));
2781 Warning(
LOCATION,
"Ship \"%s\" has an invalid Alternate Ship Class type (ships.tbl probably changed). Skipping this entry", p_objp->
name);
2791 Warning(
LOCATION,
"Ship \"%s\" has an invalid Alternate Ship Class type. Skipping this entry", p_objp->
name);
2823 mprintf((
"Using alternate ship type name: %s\n", name));
2838 mprintf((
"Using callsign: %s\n", name));
2842 static char *temp_team_names[
MAX_IFFS];
2844 temp_team_names[i] =
Iff_info[i].iff_name;
2854 mprintf((
"Invalid team color specified in mission file for ship %s, resetting to default\n", p_objp->
name));
2880 Warning(
LOCATION,
"AI Class for ship %s does not exist in ai.tbl. Setting to first available class.\n", p_objp->
name);
2901 p_objp->
cargo1 = char(temp);
3022 for (i=0; i<
count; i++)
3028 p_objp->
flags |= (1 << j);
3033 if (j == MAX_PARSE_OBJECT_FLAGS)
3034 Warning(
LOCATION,
"Unknown flag in mission file: %s\n", flag_strings[i]);
3043 for (i=0; i<
count; i++)
3049 p_objp->
flags2 |= (1 << j);
3054 if (j == MAX_PARSE_OBJECT_FLAGS_2)
3055 Warning(
LOCATION,
"Unknown flag2 in mission file: %s\n", flag_strings_2[i]);
3092 bool period_detected =
false;
3098 period_detected =
true;
3107 period_detected =
true;
3116 period_detected =
true;
3125 period_detected =
true;
3135 period_detected =
true;
3144 if (period_detected) {
3145 nprintf((
"Warning",
"Special explosion attributes have been returned to integer format"));
3225 mprintf((
"Too many initially docked instances; skipping...\n"));
3263 bool table_score =
false;
3325 mprintf((
"Extraneous extension found on replacement texture %s!\n", tr.
old_texture));
3331 mprintf((
"Extraneous extension found on replacement texture %s!\n", tr.
new_texture));
3339 mprintf((
"Too many replacement textures specified for ship '%s'!\n", p_objp->
name));
3347 if (!
stricmp(tr->new_texture,
"invisible"))
3359 if (tr->new_texture_id < 0)
3361 mprintf((
"Could not load replacement texture %s for ship %s\n", tr->new_texture, p_objp->
name));
3367 Fred_texture_replacements.push_back(*tr);
3368 Fred_texture_replacements.back().new_texture_id = -1;
3608 if (ship_class == current_team->
ship_list[
i])
3628 if (current_team->
ship_count[loadout_index] > 0)
3645 int loadout_index = -1;
3651 if (loadout_index != -1 )
3664 if (pac->default_to_this_class ==
false) {
3665 loadout_index = pac->ship_class;
3670 if (loadout_index != -1 ) {
3678 if (loadout_index != -1 ) {
3698 for (
size_t i=0;
i < Parse_objects.size();
i++)
3706 reassignments.push_back(
i);
3713 for (
size_t m=0;
m < reassignments.size();
m++)
3715 p_object *p_objp = &Parse_objects[reassignments[
m]];
3717 bool loadout_assigned =
false;
3724 loadout_assigned =
true;
3740 loadout_assigned =
true;
3747 Assert (loadout_assigned);
3759 Parse_objects.clear();
3772 Parse_objects.push_back(pobj);
3807 subsys_status *ship_subsystems = &Subsys_status[subsys_ind];
3846 if (
i < num_pbanks )
3869 if ( j < num_sbanks )
3890 for (ii = Parse_objects.begin(); ii != Parse_objects.end(); ++ii)
3891 if (ii->net_signature == net_signature)
3904 for (ii = Parse_objects.begin(); ii != Parse_objects.end(); ++ii)
3936 int wingnum, objnum, num_create_save;
3938 int pre_create_count;
3976 if ( shipnum == -1 ) {
4012 if ( num_to_create == 0 )
4032 time_to_arrive += 7;
4041 time_to_arrive += 7;
4042 time_to_arrive *= 1000;
4053 num_create_save = num_to_create;
4058 if ( num_to_create == 0 ){
4085 if (p_objp->
wingnum != wingnum)
4095 specific_instance--;
4110 if (num_to_create == 0)
4212 if (num_to_create == 0)
4217 Assert (num_to_create == 0);
4223 for (i = 0; i <
length; i++)
4228 for (j = i; j < length - 1; j++)
4258 if ( it < MAX_STARTING_WINGS ){
4292 Warning(
LOCATION,
"ships in wing %s are ignoring different player orders. Please find Mark A\nto talk to him about this.", wingp->
name );
4302 return num_create_save;
4307 int wingnum,
i, wing_goals, delay, saved_arrival_delay;
4343 if (
Wings[i].wing_insignia_texture != -1)
4415 saved_arrival_delay = delay;
4484 for (i = 0; i <
count; i++ ) {
4485 if ( !
stricmp( wing_flag_strings[i],
NOX(
"ignore-count")) )
4487 else if ( !
stricmp( wing_flag_strings[i],
NOX(
"reinforcement")) )
4489 else if ( !
stricmp( wing_flag_strings[i],
NOX(
"no-arrival-music")) )
4491 else if ( !
stricmp( wing_flag_strings[i],
NOX(
"no-arrival-message")) )
4493 else if ( !
stricmp( wing_flag_strings[i],
NOX(
"no-arrival-warp")) )
4495 else if ( !
stricmp( wing_flag_strings[i],
NOX(
"no-departure-warp")) )
4497 else if ( !
stricmp( wing_flag_strings[i],
NOX(
"no-dynamic")) )
4499 else if ( !
stricmp( wing_flag_strings[i],
NOX(
"nav-carry-status")) )
4502 Warning(
LOCATION,
"unknown wing flag\n%s\n\nSkipping.", wing_flag_strings[i]);
4574 if ( wing_goals != -1 ) {
4579 for ( sexp =
CDR(wing_goals); sexp != -1; sexp =
CDR(sexp) )
4587 char *ship_name = ship_names[
i];
4595 if ( !strcmp(ship_name, p_objp->name) ) {
4597 Assert (p_objp->wingnum == -1);
4600 p_objp->wingnum = wingnum;
4601 p_objp->pos_in_wing =
i;
4606 Warning(
LOCATION,
"Wing %s specifies an arrival delay of %ds, but it also contains a player. The arrival delay will be reset to 0.", wingp->
name, saved_arrival_delay);
4615 saved_arrival_delay = 0;
4621 if (assigned == 0) {
4622 Error(
LOCATION,
"Cannot load mission -- for wing %s, ship %s is not present in #Objects section.\n", wingp->
name, ship_name);
4623 }
else if (assigned > 1) {
4624 Error(
LOCATION,
"Cannot load mission -- for wing %s, ship %s is specified multiple times in wing.\n", wingp->
name, ship_name);
4655 prp = &Path_restrictions[*path_mask];
4660 int j, bay_path, modelnum;
4679 *path_mask |= (1 << bay_path);
4748 Error(
LOCATION,
"The first starting wing and the first team-versus-team wing must have the same wing name.\n");
4760 if (p_objp->wingnum >= 0)
4809 event->repeat_count = 1;
4816 event->repeat_count = -1;
4821 event->trigger_count = 1;
4824 event->interval = -1;
4842 event->objective_text = NULL;
4847 event->objective_key_text =
vm_strdup(buf);
4849 event->objective_key_text = NULL;
4859 Warning(
LOCATION,
"+Team: value was out of range in the mission file! This was probably caused by a bug in an older version of FRED. Using -1 for now.");
4860 Warned_about_team_out_of_range =
true;
4870 for (
int i = 0;
i < (
int)buffer.size();
i++) {
4876 add_flag = add_flag << j;
4877 event->mission_log_flags |= add_flag;
4888 Error (
LOCATION,
"Repeat count for mission event %s is 0.\nMust be >= 1 or negative!", event->
name );
4954 Warning(
LOCATION,
"+Team: value was out of range in the mission file! This was probably caused by a bug in an older version of FRED. Using -1 for now.");
4955 Warned_about_team_out_of_range =
true;
5113 if (rforce_obj == NULL) {
5122 Warning(
LOCATION,
"Reinforcement %s is part of a wing - Ignoring reinforcement declaration", ptr->
name);
5127 instance = rforce_obj->
wingnum;
5133 if (instance >= 0) {
5152 background->
suns.clear();
5177 background->
suns.push_back(sle);
5218 background->
bitmaps.push_back(sle);
5250 Neb2_poof_flags = ((1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5));
5285 if (z == NUM_NEBULAS)
5368 float speed, density;
5464 int i, j, num_variables = 0;
5480 for (j = 0; j < num_variables; j++) {
5492 WarningEx(
LOCATION,
"Variable %s has the same name as a campaign persistent variable. One of these should be renamed to avoid confusion",
Sexp_variables[j].text);
5500 for (j = 0; j < num_variables; j++) {
5512 WarningEx(
LOCATION,
"Variable %s has the same name as a player persistent variable. One of these should be renamed to avoid confusion",
Sexp_variables[j].text);
5525 Warned_about_team_out_of_range =
false;
5550 if (Subsys_status != NULL) {
5552 Subsys_status = NULL;
5602 strcat_s(text,
"(The current campaign is \"");
5605 strcat_s(text,
"(The current mission is \"");
5609 strcat_s(text,
"\", and the current mod is \"");
5612 strcat_s(text,
"<retail default> ");
5614 for (
char *mod_token =
Cmdline_mod; *mod_token !=
'\0'; mod_token += strlen(mod_token) + 1) {
5620 strcpy(text + strlen(text) - 1,
"\".)\n\n You can continue to load the mission, but it is quite likely that you will encounter a large number of mysterious errors. It is recommended that you either select a ");
5621 strcat(text, (
Game_mode & GM_CAMPAIGN_MODE) ?
"campaign" :
"mission");
5622 strcat(text,
" that is compatible with your current mod, or else exit FreeSpace and select a different mod.\n\n");
5624 strcat(text,
"Do you want to continue to load the mission?");
5628 if (popup_rval == 0) {
5638 sprintf(text,
"Warning!\n\nThe current mission has generated %d warnings and/or errors during load. These are usually caused by corrupted ship models or syntax errors in the mission file. While FreeSpace Open will attempt to compensate for these issues, it cannot guarantee a trouble-free gameplay experience. Source Code Project staff cannot provide assistance or support for these problems, as they are caused by the mission's data files, not FreeSpace Open's source code.", (saved_warning_count -
Global_warning_count) + (saved_error_count -
Global_error_count));
5662 Assert( Player_start_pobject != NULL );
5697 Assert(MAX_TVT_WINGS <= MAX_STARTING_WINGS);
5700 if (i<MAX_TVT_WINGS)
5719 Arriving_support_ship = NULL;
5734 if ( (Ships[i].objnum >= 0) && (Ships[i].departure_anchor >= 0) )
5735 Ships[
i].departure_anchor = indices[Ships[
i].departure_anchor];
5742 if (Wings[i].wave_count && (Wings[i].departure_anchor >= 0) )
5743 Wings[
i].departure_anchor = indices[Wings[
i].departure_anchor];
5753 int result, bad_node, op;
5770 nprintf((
"Error",
"%s", error_msg.c_str()));
5773 nprintf((
"Warning",
"%s", error_msg.c_str()));
5819 if ( p_objp->wingnum == -1 )
5857 Mission_end_time = -1;
5859 Allow_arrival_music_timestamp=
timestamp(0);
5860 Allow_arrival_message_timestamp=
timestamp(0);
5861 Arrival_message_delay_timestamp =
timestamp(-1);
5864 for(idx=0; idx<2; idx++){
5867 Arrival_message_delay_timestamp_m[
idx] =
timestamp(-1);
5886 real_fname[
sizeof(real_fname)-1] =
'\0';
5888 char *
p = strrchr(real_fname,
'.');
5895 if ( mission_p == NULL )
5906 if (filelength == 0) {
5919 mprintf((
"MISSIONS: Unable to parse '%s'! Error message = %s.\n", real_fname, e.what()));
5973 Error(
LOCATION,
"Couldn't open mission '%s'\n", mission_name );
5989 if (flags & MPF_IMPORT_FSM) {
5997 The_mission.
Reset();
6003 mprintf((
"MISSIONS: Unable to parse '%s'! Error message = %s.\n", mission_name, e.what()));
6019 if (Subsys_status != NULL)
6022 Subsys_status = NULL;
6026 Parse_objects.clear();
6052 object *leader_objp;
6121 if (
Wings[i].current_count == 0 )
6148 mprintf((
"Setting arrival cue of ship %s to false for initial docking purposes.\n", pobjp->
name));
6152 if (reset_wing && pobjp->
wingnum >= 0)
6155 mprintf((
"Setting arrival cue of wing %s to false for initial docking purposes.\n", wingp->
name));
6160 if ((&(*ii) != pobjp) && (ii->wingnum == pobjp->
wingnum))
6195 if (existing_leader != NULL)
6324 Warning(
LOCATION,
"No dock leaders found in the docking group containing %s. The group will not appear in-mission!\n", pobjp->
name);
6355 ftemp =
cfopen(filename,
"rt");
6362 if ( filelength == 0 )
6373 nprintf((
"Network",
"Unable to process %s because we couldn't find $Name:", filename));
6379 nprintf((
"Network",
"Unable to process %s because we couldn't find +Game Type Flags:\n", filename));
6386 mprintf((
"MISSIONS: Unable to parse '%s'! Error message = %s.\n", filename, e.what()));
6470 int shipnum, anchor_objnum;
6471 vec3d anchor_pos, rand_vec, new_fvec;
6486 int iff_index = anchor;
6487 iff_index &= ~SPECIAL_ARRIVAL_ANCHOR_FLAG;
6505 nprintf ((
"allender",
"couldn't find ship for arrival anchor -- using location ship created at"));
6511 Assert ( shipnum != -1 );
6533 Warning(
LOCATION,
"Distance of %d is invalid in mission_set_arrival_location. Defaulting to 100.\n", dist);
6598 memcpy( new_orient, &
Objects[objnum].orient,
sizeof(
matrix) );
6600 return anchor_objnum;
6626 Assert ( i < Num_reinforcements );
6648 if ( should_arrive ) {
6654 if ( should_arrive ) {
6681 if ( shipnum == -1 ) {
6687 WarningEx(
LOCATION,
"Warning: Ship %s cannot arrive from docking bay of destroyed or departed %s.\n", objp->
name, name);
6693 WarningEx(
LOCATION,
"Warning: Ship %s cannot arrive from destroyed docking bay of %s.\n", objp->
name, name);
6731 if (p_objp == Arriving_support_ship)
6753 if (p_objp->wingnum == wingnum)
6765 if (p_objp->wingnum != -1)
6796 if ( shipnum != -1 ) {
6797 object *requester_objp, *support_objp;
6799 support_objp = &
Objects[objnum];
6807 Arriving_support_ship = NULL;
6808 Num_arriving_repair_targets = 0;
6814 return (pobjp->
next != NULL) && (pobjp->
prev != NULL);
6834 use_terran_cmd = ((
frand() - 0.75) > 0.0f)?1:0;
6837 if ((rship < 0) || use_terran_cmd)
6839 else if (rship >= 0)
6842 Arrival_message_delay_timestamp =
timestamp(-1);
6865 if (Arriving_support_ship)
6934 int multi_team_filter =
Ships[rship].
team;
6941 if (!
timestamp_valid(Arrival_message_delay_timestamp_m[multi_team_filter]))
7027 if (goal_is_to_warp)
7032 mprintf((
"Looks like we were ordered to depart; initiating the standard departure logic\n"));
7037 mprintf((
"Our current goal is to warp! Trying to warp...\n"));
7072 mprintf((
"Anchor ship %s hasn't arrived yet! Trying to warp...\n", name));
7079 if (anchor_shipnum < 0)
7081 mprintf((
"Anchor ship %s not found! Trying to warp...\n", name));
7088 mprintf((
"Anchor ship %s not suitable for departure (dying, departing, bays destroyed, etc.). Trying to warp...\n", name));
7097 mprintf((
"Acquired departure path\n"));
7107 mprintf((
"Setting mode to warpout\n"));
7124 mprintf((
"Can't warp! Doing something else instead.\n"));
7245 Verify( Subsys_status != NULL );
7293 memcpy(&temp_entry, &Subsys_status[new_index],
sizeof(
subsys_status));
7298 memcpy(&Subsys_status[i], &Subsys_status[i-1],
sizeof(
subsys_status));
7305 memcpy(&Subsys_status[new_index], &temp_entry,
sizeof(
subsys_status));
7316 if (ii->subsys_index >= new_index)
7352 return Num_parse_names++;
7381 goto continue_outer_loop;
7387 continue_outer_loop:
7401 int index = Num_path_restrictions++;
7420 iff_name = strtok(tmp,
" >");
7423 if (!
stricmp(iff_name,
"enemy"))
7424 iff_name =
"hostile";
7431 if (
stristr(name+5,
"player") != NULL)
7441 if (special_anchor >= 0)
7442 return special_anchor;
7467 #define WARP_IN_MIN_DISTANCE 1000.0f
7468 #define WARP_IN_TIME_MIN 3000 // warps in min 3 seconds later
7469 #define WARP_IN_TIME_MAX 6000 // warps in max 6 seconds later
7479 Assert ( Arriving_support_ship );
7482 mprintf((
"Reached MAX_AI_GOALS trying to add repair request!\n"));
7493 if ( i != Num_arriving_repair_targets ){
7498 Num_arriving_repair_targets++;
7505 extern int pp_collide_any(
vec3d *curpos,
vec3d *goalpos,
float radius,
object *ignore_objp1,
object *ignore_objp2,
int big_only_flag);
7520 rand_val = 1.0f + (rand_val - 0.5f)*0.2
f;
7536 vec3d center, warp_in_pos;
7538 ship *requester_shipp;
7539 int i, j, requester_species;
7545 if ( Arriving_support_ship ) {
7561 vm_vec_sub( &warp_in_pos, ¢er, &(requester_objp->
pos) );
7575 pobj->
pos = warp_in_pos;
7606 if ( (it->species == requester_species) && (it->flags &
SIF_SUPPORT) ) {
7607 i = std::distance(
Ship_info.cbegin(), it);
7623 pobj->
team = requester_shipp->
team;
7647 if ( i == Num_cargo ) {
7707 if ( Arriving_support_ship )
7721 if ( !Arriving_support_ship )
7742 if ( !Arriving_support_ship )
7753 if ( index == Num_arriving_repair_targets )
7757 for ( i = index; i < Num_arriving_repair_targets - 1; i++ )
7760 Num_arriving_repair_targets--;
7790 static int mission_parse_lookup_alt_index_warn = 1;
7799 if (mission_parse_lookup_alt_index_warn)
7802 mission_parse_lookup_alt_index_warn = 0;
7842 if (i < Mission_alt_type_count - 1)
7845 Mission_alt_type_count--;
7878 static int mission_parse_lookup_callsign_index_warn = 1;
7887 if (mission_parse_lookup_callsign_index_warn)
7890 mission_parse_lookup_callsign_index_warn = 0;
7930 if (i < Mission_callsign_count - 1)
7933 Mission_callsign_count--;
7954 char *s1, *s2, *
t1, *
t2;
7956 s1 = strstr(str, section_start);
7957 s2 = strstr(s1, section_end);
7963 t1 = strstr(t1+1, text_start);
7964 if (!t1 || t1 > s2)
return;
7966 t2 = strstr(t1, text_end);
7967 if (!t2 || t2 > s2)
return;
7998 Fred_texture_replacements.clear();
#define SF2_TOGGLE_SUBSYSTEM_SCANNING
#define SF2_WEAPONS_LOCKED
#define P2_SF2_SCRAMBLE_MESSAGES
void reset_arrival_to_false(p_object *pobjp, bool reset_wing)
void advance_to_eoln(char *more_terminators)
matrix skybox_orientation
char Parse_names[MAX_SHIPS+MAX_WINGS][NAME_LENGTH]
char Starting_wing_names[MAX_STARTING_WINGS][NAME_LENGTH]
void dock_free_dock_list(object *objp)
#define SHIP_GET_UNSILENCED
void parse_music(mission *pm, int flags)
#define ARRIVAL_TIMESTAMP
int timestamp(int delta_ms)
char Neb2_texture_name[MAX_FILENAME_LEN]
void parse_object_set_handled_flag_helper(p_object *pobjp, p_dock_function_info *infop)
int mission_is_support_ship_arriving()
#define FS_MISSION_FILE_EXT
#define MULTIPLAYER_CLIENT
int ship_info_lookup(const char *token)
void wing_bash_ship_name(char *ship_name, const char *wing_name, int index)
int secondary_ammo[MAX_SHIP_SECONDARY_BANKS]
void obj_set_flags(object *obj, uint new_flags)
float get_max_shield_quad(object *objp)
char wing_status_wing_pos
int mission_parse_add_callsign(const char *name)
int model_find_bay_path(int modelnum, char *bay_path_name)
void mission_parse_close()
int stuff_string_list(SCP_vector< SCP_string > &slp)
SCP_vector< starfield_list_entry > suns
model_subsystem * system_info
char weaponry_pool_variable[MAX_WEAPON_TYPES][TOKEN_LENGTH]
int primary_bank_weapons[MAX_SHIP_PRIMARY_BANKS]
void post_process_mission()
int Total_goal_target_names
#define MAX_SHIP_PRIMARY_BANKS
void parse_custom_bitmap(const char *expected_string_640, const char *expected_string_1024, char *string_field_640, char *string_field_1024)
char weapon_select_background[GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
bool weapon_required[MAX_WEAPON_TYPES]
EModelAnimationPosition turret_animation_position
#define P2_SF2_AFFECTED_BY_GRAVITY
int ai_abort_rearm_request(object *requester_objp)
int Cmdline_old_collision_sys
#define DEPART_AT_LOCATION
char Mission_callsigns[MAX_CALLSIGNS][NAME_LENGTH]
#define P2_SF2_NO_BUILTIN_MESSAGES
int secondary_bank_weapons[MAX_SHIP_SECONDARY_BANKS]
#define ICON_LARGESHIP_WING
void player_set_squad_bitmap(player *p, char *fname, bool ismulti)
#define SUBSYS_STATUS_NO_CHANGE
void mission_parse_support_arrived(int objnum)
int Mission_arrival_timestamp
void multi_respawn_build_points()
void mission_log_add_entry(int type, char *pname, char *sname, int info_index)
int check_for_string(const char *pstr)
#define MPF_ONLY_MISSION_INFO
#define P_OF_BEAM_PROTECTED
#define AIG_TYPE_EVENT_WING
#define LOGFILE_EVENT_LOG
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
#define OLD_GAME_TYPE_SINGLE_MULTI
#define OF_LASER_PROTECTED
#define MISSION_FLAG_FULLNEB
char briefing_music_name[NAME_LENGTH]
int mission_parse_lookup_callsign(const char *name)
float frand_range(float min, float max)
Return a floating point number in the range min..max.
polymodel * model_get(int model_num)
#define P_OF_INVULNERABLE
weapon_info Weapon_info[MAX_WEAPON_TYPES]
void parse_bitmaps(mission *pm)
void nebula_init(const char *filename, int pitch, int bank, int heading)
int support_available_for_species
SCP_string recommendation_text
int get_anchor(char *name)
void dock_dock_docked_objects(p_object *objp)
void send_reinforcement_avail(int rnum)
char ship_name[NAME_LENGTH]
int Total_initially_docked
#define MISSION_FLAG_SCRAMBLE
float vm_vec_mag(const vec3d *v)
#define SF2_NO_DISABLED_SELF_DESTRUCT
background_t Backgrounds[MAX_BACKGROUNDS]
#define P_SF_NO_ARRIVAL_MUSIC
submodel_instance_info submodel_info_1
void waypoint_add_list(const char *name, SCP_vector< vec3d > &vec_list)
void mission_parse_remove_alt(const char *name)
#define SEXP_ERROR_CHECK_MODE
void send_ship_create_packet(object *objp, int is_support)
GLsizei const GLfloat * value
bool is_ship_assignable(p_object *p_objp)
#define SF2_NO_SUBSPACE_DRIVE
void mission_parse_lookup_callsign_index(int index, char *out)
void parse_common_object_data(p_object *objp)
char ui_name[NAME_LENGTH]
char wing_status_wing_index
void waypoint_parse_init()
#define P2_SF2_NAV_CARRY_STATUS
int mission_do_departure(object *objp, bool goal_is_to_warp)
void mission_set_wing_arrival_location(wing *wingp, int num_to_set)
LOCAL struct @256 Initially_docked[MAX_SHIPS]
SCP_vector< p_object > Parse_objects
void message_parse(bool importing_from_fsm)
void parse_waypoints_and_jumpnodes(mission *pm)
void swap_parse_object(p_object *p_obj, int new_ship_class)
int parse_mission(mission *pm, int flags)
SCP_vector< texture_replace > replacement_textures
int replace_all(char *str, char *oldstr, char *newstr, uint max_len, int range)
#define MIN_SUBSYS_STATUS_SIZE
void mission_maybe_make_ship_arrive(p_object *p_objp)
float ship_max_shield_strength
#define DEFAULT_NMODEL_FLAGS
brief_stage stages[MAX_BRIEF_STAGES]
void process_loadout_objects()
char * Neb2_filenames[NUM_NEBULAS]
#define SF2_FORCE_SHIELDS_ON
int ship_iff_color[MAX_IFFS][MAX_IFFS]
void fiction_viewer_load(int stage)
char Player_start_shipname[NAME_LENGTH]
#define ICON_SUPPORT_SHIP
void mission_parse_lookup_alt_index(int index, char *out)
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
char background[GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
void parse_messages(mission *pm, int flags)
#define P2_OF_TARGETABLE_AS_BOMB
#define MAX_MODEL_TEXTURES
void _cdecl void void _cdecl void _cdecl void _cdecl WarningEx(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
int detail[MAX_MODEL_DETAIL_LEVELS]
void multi_ping_send_all()
SCP_vector< fiction_viewer_stage > Fiction_viewer_stages
#define P2_SF2_SECONDARIES_LOCKED
int is_training_mission()
#define MESSAGE_ARRIVE_ENEMY
#define ARRIVAL_MESSAGE_MIN_SEPARATION
void parse_event(mission *pm)
#define list_append(head, elem)
int secondary_banks[MAX_SHIP_SECONDARY_BANKS]
int subsystem_stricmp(const char *str1, const char *str2)
void parse_briefing(mission *pm, int flags)
void hud_wingman_status_set_index(wing *wingp, ship *shipp, p_object *pobjp)
char story_filename[MAX_FILENAME_LEN]
void player_set_squad(player *p, char *squad_name)
#define MAX_PATH_RESTRICTIONS
void multi_maybe_send_repair_info(object *dest_objp, object *source_objp, int code)
char wing_squad_filename[MAX_FILENAME_LEN]
#define WF_RESET_REINFORCEMENT
void event_music_arrival(int team)
void parse_reinforcements(mission *pm)
void mission_parse_set_arrival_locations()
struct vec3d::@225::@227 xyz
int Loading_screen_bm_index
void static_randvec(int num, vec3d *vp)
[To be described]
int mission_parse_add_alt(const char *name)
void parse_plot_info(mission *pm)
#define ARRIVAL_MUSIC_MIN_SEPARATION
#define SF2_DONT_COLLIDE_INVIS
#define LOG_SHIP_DEPARTED
object * dock_find_object_at_dockpoint(object *objp, int dockpoint)
void parse_waypoint_list(mission *pm)
int find_wing_name(char *name)
void fix_old_special_hits(p_object *p_objp, int variable_index)
void fiction_viewer_reset()
int target[MAX_OBJECT_STATUS]
#define WF_NO_ARRIVAL_MUSIC
#define MISSION_TYPE_MULTI
#define SF2_FRIENDLY_STEALTH_INVIS
int is_sexp_top_level(int node)
#define SF2_AFFECTED_BY_GRAVITY
void mission_parse_eval_stuff()
#define MAX_PARSE_OBJECT_FLAGS
bool dock_check_find_direct_docked_object(object *objp, object *other_objp)
ai_info Ai_info[MAX_AI_INFO]
subsys_status * parse_get_subsys_status(p_object *pobjp, char *subsys_name)
#define P2_SF2_NO_SUBSPACE_DRIVE
char background[GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
#define Assertion(expr, msg,...)
void parse_one_background(background_t *background)
int message_persona_name_lookup(char *name)
int Num_unknown_loadout_classes
int dock_find_dockpoint_used_by_object(object *objp, object *other_objp)
SCP_string team_color_setting
#define END_OF_LIST(head)
#define SF2_NAVPOINT_CARRY
#define OF_SPECIAL_WARPIN
#define SF2_SET_CLASS_DYNAMICALLY
int primary_ammo[MAX_SHIP_PRIMARY_BANKS]
char ani_filename[MAX_FILENAME_LEN]
char voice_filename[MAX_FILENAME_LEN]
model_subsystem * subsystems
#define SCORE_FICTION_VIEWER
void init_ai_object(int objnum)
int ds_eax_get_preset_id(const char *name)
ship_subsys * targeted_subsys
int Knossos_warp_ani_used
ushort Last_file_checksum
#define P2_RED_ALERT_DELETED
int ship_find_exited_ship_by_name(char *name)
sexp_variable Sexp_variables[MAX_SEXP_VARIABLES]
bool default_to_this_class
int wing_insignia_texture
int parse_create_object_sub(p_object *objp)
bool ship_fighterbays_all_destroyed(ship *shipp)
void vm_vec_scale_add2(vec3d *dest, const vec3d *src, float k)
#define SIF2_INTRINSIC_NO_SHIELDS
void parse_debriefing_new(mission *pm)
#define P2_SF2_NO_DISABLED_SELF_DESTRUCT
void parse_goal(mission *pm)
#define P2_SF2_WEAPONS_LOCKED
#define MAX_SHIP_BAY_PATHS
int turret_next_fire_stamp
int primary_bank_weapons[MAX_SHIP_PRIMARY_BANKS]
#define MAX_MISSION_EVENT_LOG_FLAGS
void ai_clear_ship_goals(ai_info *aip)
path_restriction_t Path_restrictions[MAX_PATH_RESTRICTIONS]
#define MAX_SHIPS_PER_WING
char dockee_point[NAME_LENGTH]
std::basic_string< char, std::char_traits< char >, std::allocator< char > > SCP_string
void obj_merge_created_list(void)
void parse_events(mission *pm)
#define P_SF2_FRIENDLY_STEALTH_INVIS
void stuff_matrix(matrix *mp)
int ship_navigation_ok_to_warp(ship *sp)
int primary_bank_capacity[MAX_SHIP_PRIMARY_BANKS]
cmd_brief Cmd_briefs[MAX_TVT_TEAMS]
ubyte ships_allowed[MAX_SHIP_CLASSES]
#define AIG_TYPE_EVENT_SHIP
#define P2_SF2_NO_DEATH_SCREAM
int current_secondary_bank
GLfloat GLfloat GLfloat v2
#define CMD_BRIEF_STAGES_MAX
int get_index_sexp_variable_name(const char *text)
SOUNDTRACK_INFO Soundtracks[MAX_SOUNDTRACKS]
void convert_sexp_to_string(SCP_string &dest, int cur_node, int mode)
briefing Briefings[MAX_TVT_TEAMS]
int stuff_sexp_variable_list()
void mission_parse_mark_non_arrival(p_object *p_objp)
int special_exp_shockwave_speed
int required_string_either(char *str1, char *str2)
Checks for one of two required strings.
#define MAX_SQUADRON_WINGS
#define MAX_DEBRIS_PIECES
int special_warpin_objnum
GLenum GLuint GLenum GLsizei const GLchar * buf
ship_subsys_info subsys_info[SUBSYSTEM_MAX]
#define MAX_REINFORCEMENT_MESSAGES
int match_and_stuff(int f_type, char *strlist[], int max, char *description)
int get_max_sparks(object *ship_objp)
mission_goal Mission_goals[MAX_GOALS]
SCP_vector< message_extra > Message_waves
#define CONTRAIL_THRESHOLD_DEFAULT
script_state Script_system("FS2_Open Scripting")
#define OLD_GAME_TYPE_SINGLE_ONLY
int allocate_subsys_status()
#define SPECIAL_ARRIVAL_ANCHOR_FLAG
SCP_list< CJumpNode > Jump_nodes
void stuff_float(float *f)
void fix_old_special_explosions(p_object *p_objp, int variable_index)
#define MISSION_TYPE_MULTI_COOP
#define SHIP_GUARDIAN_THRESHOLD_DEFAULT
void parse_init(bool basic=false)
#define SHIP_GET_ONLY_PLAYERS
void event_music_set_score(int score_index, char *name)
iff_info Iff_info[MAX_IFFS]
int ship_count[MAX_SHIP_CLASSES]
#define MSS_FLAG_TURRET_LOCKED
#define SF2_SCRAMBLE_MESSAGES
char * Reinforcement_type_names[]
reinforcements Reinforcements[MAX_REINFORCEMENTS]
void game_busy(const char *filename=NULL)
#define P_SF_HIDDEN_FROM_SENSORS
int Num_unknown_weapon_classes
int num_initial_asteroids
void parse_player_info(mission *pm)
int ship_can_use_warp_drive(ship *shipp)
#define OF_TARGETABLE_AS_BOMB
int Squadron_wings[MAX_SQUADRON_WINGS]
void mission_parse_mark_reinforcement_available(char *name)
int query_operator_return_type(int op)
int mission_did_ship_arrive(p_object *objp)
sound_env sound_environment
#define SCORE_DEBRIEF_FAIL
int object_is_docked(object *objp)
int mission_remove_scheduled_repair(object *objp)
bool use_special_explosion
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
#define MAX_SHIP_SECONDARY_BANKS
int mission_parse_lookup_alt(const char *name)
char * Parse_object_flags[MAX_PARSE_OBJECT_FLAGS]
#define SCORE_DEBRIEF_AVERAGE
#define AIPF_FIX_AI_CLASS_BUG
#define DEPART_AT_DOCK_BAY
int destroy_before_mission_time
matrix * vm_vector_2_matrix(matrix *m, const vec3d *fvec, const vec3d *uvec, const vec3d *rvec)
int Num_path_restrictions
char ship_select_background[GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
#define MISSION_TYPE_SINGLE
p_object * mission_parse_get_arrival_ship(const char *name)
Returns the parse object on the ship arrival list associated with the given name. ...
void vm_vec_add2(vec3d *dest, const vec3d *src)
char pof_file[MAX_FILENAME_LEN]
char squad_filename[MAX_FILENAME_LEN]
#define MAX_BUILTIN_MESSAGE_TYPES
char voice[MAX_FILENAME_LEN]
int mission_set_arrival_location(int anchor, int location, int distance, int objnum, int path_mask, vec3d *new_pos, matrix *new_orient)
void mission_parse_fixup_players()
void mission_parse_reset_alt()
GLdouble GLdouble GLdouble r
char * Cargo_names[MAX_CARGO]
char * Departure_location_names[MAX_DEPARTURE_NAMES]
#define MAX_OBJECT_STATUS
#define MAX_DEPARTURE_NAMES
void SetModel(char *model_name, bool show_polys=false)
void parse_reinforcement(mission *pm)
float max_shield_recharge
#define OLD_GAME_TYPE_MULTI_ONLY
fix game_get_overall_frametime()
SCP_vector< alt_class > s_alt_classes
struct matrix::@228::@230 vec
#define WF_NO_DEPARTURE_WARP
#define NETINFO_FLAG_AM_MASTER
char created[DATE_TIME_LENGTH]
void resolve_parse_flags(object *objp, int parse_flags, int parse_flags2)
int mission_log_get_time(int type, char *pname, char *sname, fix *time)
float ship_max_hull_strength
void vm_vec_scale(vec3d *dest, float s)
#define P_SF_RED_ALERT_STORE_STATUS
#define P_OF_FLAK_PROTECTED
int mission_parse_is_multi(const char *filename, char *mission_name)
#define ARRIVAL_MESSAGE_DELAY_MIN
int primary_bank_ammo[MAX_SHIP_PRIMARY_BANKS]
ubyte weapons_allowed[MAX_WEAPON_TYPES]
#define SW_FLAG_TURRET_LOCK
int * ship_replacement_textures
GLboolean GLboolean GLboolean GLboolean a
void mission_hotkey_reset_saved()
char Mission_alt_types[MAX_ALT_TYPE_NAMES][NAME_LENGTH]
int secondary_bank_capacity[MAX_SHIP_SECONDARY_BANKS]
void parse_fiction(mission *pm)
void parse_create_docked_object_helper(p_object *pobjp, p_dock_function_info *infop)
#define SF2_NO_DEATH_SCREAM
int ship_subsys_disrupted(ship_subsys *ss)
char * Nebula_filenames[NUM_NEBULAS]
ai_profile_t * ai_profile
#define MISSION_FLAG_RED_ALERT
#define SEXP_VARIABLE_BLOCK
#define strnicmp(s1, s2, n)
void ai_dock_with_object(object *docker, int docker_index, object *dockee, int dockee_index, int dock_type)
char Squadron_wing_names[MAX_SQUADRON_WINGS][NAME_LENGTH]
#define WF_WING_DEPARTING
float max_hull_repair_val
#define MAX_STARTING_WINGS
ai_goal goals[MAX_AI_GOALS]
mission_event Mission_events[MAX_MISSION_EVENTS]
texture_map maps[MAX_MODEL_TEXTURES]
#define SF2_HIDE_SHIP_NAME
#define P_OF_LASER_PROTECTED
void stuff_string(char *outstr, int type, int len, char *terminators)
int Mission_callsign_count
char * stristr(char *str, const char *substr)
int FindTexture(int bm_handle)
ai_profile_t Ai_profiles[MAX_AI_PROFILES]
int ship_get_random_player_wing_ship(int flags, float max_dist, int persona_index, int get_first, int multi_team)
#define MISSION_FLAG_BEAM_FREE_ALL_BY_DEFAULT
char * Mission_event_log_flags[MAX_MISSION_EVENT_LOG_FLAGS]
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
char * Goal_type_names[MAX_GOAL_TYPE_NAMES]
void vm_set_identity(matrix *m)
float ship_max_hull_strength
#define MISSION_CHECKSUM_SIZE
void event_music_reset_choices()
void debris_clear_expired_flag(debris *db)
#define WF_NO_ARRIVAL_WARP
int weaponry_pool[MAX_WEAPON_TYPES]
void ship_assign_sound(ship *sp)
#define P_OF_MISSILE_PROTECTED
void parse_player_info2(mission *pm)
#define P2_SF2_LOCK_ALL_TURRETS_INITIALLY
#define SF_HIDDEN_FROM_SENSORS
void mission_parse_mark_non_arrivals()
SCP_vector< alt_class > alt_classes
char squad_name[NAME_LENGTH]
int iff_lookup(char *iff_name)
int special_exp_deathroll_time
int primary_banks[MAX_SHIP_PRIMARY_BANKS]
void ai_do_default_behavior(object *obj)
#define NETINFO_FLAG_INGAME_JOIN
int alt_iff_color[MAX_IFFS][MAX_IFFS]
#define ICON_CRUISER_WING
void SetVisibility(bool enabled)
int required_string(const char *pstr)
#define MAX_GOAL_TYPE_NAMES
int Num_arriving_repair_targets
#define P_SF_CANNOT_ARRIVE
int add_path_restriction()
float max_shield_strength
#define P2_SF2_SHIP_LOCKED
int secondary_bank_weapons[MAX_SHIP_SECONDARY_BANKS]
int status[MAX_OBJECT_STATUS]
#define DEFAULT_AMBIENT_LIGHT_LEVEL
void ai_post_process_mission()
#define REPAIR_INFO_WARP_ADD
void mission_parse_handle_late_arrivals(p_object *p_objp)
int optional_string(const char *pstr)
char skybox_model[MAX_FILENAME_LEN]
int parse_lookup_alt_name(char *name)
float aggregate_current_hits
char * Status_target_names[MAX_STATUS_NAMES]
char * Ai_behavior_names[MAX_AI_BEHAVIORS]
#define MISSION_DESC_LENGTH
void mission_parse_set_up_initial_docks()
#define MISSION_LOADOUT_SHIP_LIST
#define MONITOR(function_name)
#define ICON_KNOSSOS_DEVICE
char * Status_desc_names[MAX_STATUS_NAMES]
void parse_objects(mission *pm, int flag)
int secondary_bank_ammo_capacity[MAX_SHIP_SECONDARY_BANKS]
char path_names[MAX_SHIP_BAY_PATHS][MAX_NAME_LEN]
void find_and_stuff(char *id, int *addr, int f_type, char *strlist[], int max, char *description)
int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, int ferror=1, int duplicate=0)
int ship_get_random_ship_in_wing(int wingnum, int flags, float max_dist, int get_first)
char Mission_filename[80]
void read_file_text(const char *filename, int mode, char *processed_text, char *raw_text)
#define WF_NO_ARRIVAL_MESSAGE
int ai_acquire_depart_path(object *pl_objp, int parent_objnum, int path_mask)
float max_subsys_strength
void conv_fix_punctuation()
int get_operator_index(const char *token)
char Cargo_names_buf[MAX_CARGO][NAME_LENGTH]
int stuff_loadout_list(int *ilp, int max_ints, int lookup_type)
#define ARRIVE_IN_FRONT_OF_SHIP
void wing_load_squad_bitmap(wing *w)
char wing_status_wing_index
cmd_brief_stage stage[CMD_BRIEF_STAGES_MAX]
#define MESSAGE_PRIORITY_LOW
#define ARRIVAL_MESSAGE_DELAY_MAX
void parse_asteroid_fields(mission *pm)
#define P2_SF2_AFTERBURNER_LOCKED
#define ARRIVE_AT_LOCATION
int secondary_bank_ammo[MAX_SHIP_SECONDARY_BANKS]
int ship_class_compare(int ship_class_1, int ship_class_2)
debris Debris[MAX_DEBRIS_PIECES]
void ship_set_new_ai_class(int ship_num, int new_ai_class)
int targeted_subsys_parent
int primary_bank_ammo_capacity[MAX_SHIP_PRIMARY_BANKS]
#define SF_NO_DEPARTURE_WARP
int check_sexp_syntax(int node, int return_type, int recursive, int *bad_node, int mode)
void ship_recalc_subsys_strength(ship *shipp)
builtin_message Builtin_messages[]
void dock_dock_objects(object *objp1, int dockpoint1, object *objp2, int dockpoint2)
void conv_fix_punctuation_section(char *str, char *section_start, char *section_end, char *text_start, char *text_end)
char loading_screen[GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
int mission_parse_get_multi_mission_info(const char *filename)
char voice[MAX_FILENAME_LEN]
int iff_x_attacks_y(int team_x, int team_y)
bool ship_useful_for_departure(int shipnum, int path_mask)
#define MAX_PARSE_OBJECT_FLAGS_2
#define REPLACE_WITH_INVISIBLE
GLint GLint GLint GLint GLint x
object Objects[MAX_OBJECTS]
for(int idx=0;idx< i;idx++)
void shipfx_warpin_start(object *objp)
#define SF_WARPED_SUPPORT
void submodel_get_two_random_points(int model_num, int submodel_num, vec3d *v1, vec3d *v2, vec3d *n1=NULL, vec3d *n2=NULL)
ushort Current_file_checksum
#define MONITOR_INC(function_name, inc)
void ets_init_ship(object *obj)
#define SPECIAL_ARRIVAL_ANCHOR_PLAYER_FLAG
int get_mission_info(const char *filename, mission *mission_p, bool basic)
void stuff_vec3d(vec3d *vp)
void event_music_set_soundtrack(char *name)
void ship_hit_sparks_no_rotate(object *ship_objp, vec3d *hitpos)
void parse_cutscenes(mission *pm)
int ship_create(matrix *orient, vec3d *pos, int ship_type, char *ship_name)
void truncate_message_lines(SCP_string &text, int num_allowed_lines)
int get_parse_name_index(const char *name)
SCP_vector< mission_cutscene > cutscenes
void ai_set_mode_warp_out(object *objp, ai_info *aip)
#define WF_DEPARTURE_ORDERED
#define SF_NO_ARRIVAL_WARP
void post_process_path_stuff()
void mission_parse_maybe_create_parse_object(p_object *pobjp)
void obj_get_average_ship_pos(vec3d *pos)
int mission_is_repair_scheduled(object *objp)
#define LOG_SHIP_DESTROYED
sexp_variable * variables
char modified[DATE_TIME_LENGTH]
void stuff_boolean(int *i, bool a_to_eol)
int red_alert_skipped_ships
int ship_guardian_threshold
#define P2_SF2_NAV_NEEDSLINK
bool use_special_explosion
#define MEF_USING_TRIGGER_COUNT
int iff_get_mask(int team)
char font_filename[MAX_FILENAME_LEN]
int TVT_wings[MAX_TVT_WINGS]
void vm_vec_copy_scale(vec3d *dest, const vec3d *src, float s)
sexp_variable Block_variables[MAX_SEXP_VARIABLES]
#define OLD_GAME_TYPE_TRAINING
#define P_SF_REINFORCEMENT
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define GM_STANDALONE_SERVER
void ai_add_ship_goal_sexp(int sexp, int type, ai_info *aip)
int Num_reinforcement_type_names
#define MULTI_END_NOTIFY_NONE
#define P_OF_PLAYER_START
float forward_cruise_percent
void vm_vec_rand_vec_quick(vec3d *rvec)
menu_music Spooled_music[MAX_SPOOLED_MUSIC]
#define OLD_MAX_GAME_TYPES
int sound_env_get(sound_env *se, int preset)
int wing_name_lookup(const char *name, int ignore_count)
#define SF2_NO_BUILTIN_MESSAGES
int turret_animation_done_time
#define HOTKEY_MISSION_FILE_ADDED
int Starting_wings[MAX_STARTING_WINGS]
void reset_parse(char *text)
#define OF_MISSILE_PROTECTED
char weaponry_amount_variable[MAX_WEAPON_TYPES][TOKEN_LENGTH]
int is_sexp_true(int cur_node, int referenced_node)
GLuint const GLchar * name
void stars_load_first_valid_background()
int RunCondition(int condition, char format='\0', void *data=NULL, class object *objp=NULL, int more_data=0)
int weaponry_count[MAX_WEAPON_TYPES]
char filename[MAX_FILENAME_LEN]
#define P2_SF2_SET_CLASS_DYNAMICALLY
char background[GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
int get_special_anchor(char *name)
void SetHookObjects(int num,...)
char background[GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
void ship_clear_ship_type_counts()
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
#define SF_RED_ALERT_STORE_STATUS
#define vm_realloc(ptr, size)
char * Icon_names[MIN_BRIEF_ICONS]
char command_sender[NAME_LENGTH]
p_object * Arriving_support_ship
#define MISSION_TYPE_TRAINING
int Num_unknown_ship_classes
#define SF2_PRIMARIES_LOCKED
int multi_quit_game(int prompt, int notify_code, int err_code, int wsa_error)
GLboolean GLboolean GLboolean b
int model_find_dock_name_index(int modelnum, char *name)
void log_printf(int logfile_type, char *format,...)
int stuff_int_list(int *ilp, int max_ints, int lookup_type)
void parse_wings(mission *pm)
debrief_stage stages[MAX_DEBRIEF_STAGES]
int get_string_or_variable(char *str)
int string_lookup(const CString &str1, char *strlist[], int max)
void physics_sim(vec3d *position, matrix *orient, physics_info *pi, float sim_time)
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
#define WING_INDEX(wingp)
void display_parse_diagnostics()
#define WIF_PLAYER_ALLOWED
#define MAX_REPLACEMENT_TEXTURES
void send_wing_create_packet(wing *wingp, int num_to_create, int pre_create_count)
#define SF_KILL_BEFORE_MISSION
#define P_KNOSSOS_WARP_IN
#define P2_SF2_PRIMARIES_LOCKED
fix base_texture_anim_frametime
#define MISSION_FLAG_PLAYER_START_AI
void post_process_ships_wings()
char ship_count_variables[MAX_SHIP_CLASSES][TOKEN_LENGTH]
void SetName(const char *new_name)
#define MAX_ALT_TYPE_NAMES
float vm_vec_dist_quick(const vec3d *v0, const vec3d *v1)
char old_texture[MAX_FILENAME_LEN]
int field_debris_type[MAX_ACTIVE_DEBRIS_TYPES]
float frand()
Return random value in range 0.0..1.0- (1.0- means the closest number less than 1.0)
GLuint GLuint GLsizei GLenum const GLvoid * indices
void parse_cmd_briefs(mission *pm)
void neb2_post_level_init()
void ai_maybe_add_form_goal(wing *wingp)
char Mission_parse_storm_name[NAME_LENGTH]
#define P2_SF2_HIDE_SHIP_NAME
void submodel_get_two_random_points_better(int model_num, int submodel_num, vec3d *v1, vec3d *v2)
void mission_bring_in_support_ship(object *requester_objp)
#define P2_SF2_TOGGLE_SUBSYSTEM_SCANNING
#define SF2_LOCK_ALL_TURRETS_INITIALLY
#define SHIP_GET_ANY_SHIP
int insert_subsys_status(p_object *pobjp)
int eval_sexp(int cur_node, int referenced_node)
char event_music_name[NAME_LENGTH]
p_object * mission_parse_get_parse_object(ushort net_signature)
void message_send_builtin_to_player(int type, ship *shipp, int priority, int timing, int group, int delay, int multi_target, int multi_team_filter)
void parse_object_clear_handled_flag_helper(p_object *pobjp, p_dock_function_info *infop)
void mission_eval_arrivals()
void parse_goals(mission *pm)
void ai_add_rearm_goal(object *requester_objp, object *support_objp)
char * Parse_object_flags_2[MAX_PARSE_OBJECT_FLAGS_2]
void shipfx_blow_up_model(object *obj, int model, int submodel, int ndebris, vec3d *exp_center)
#define SEXP_VARIABLE_CAMPAIGN_PERSISTENT
void mission_hotkey_mf_add(int set, int objnum, int how_to_add)
int special_exp_deathroll_time
void parse_bring_in_docked_wing(p_object *p_objp, int wingnum, int shipnum)
char subobj_name[MAX_NAME_LEN]
void find_and_stuff_or_add(char *id, int *addr, int f_type, char *strlist[], int *total, int max, char *description)
int event_music_get_soundtrack_index(char *name)
struct p_dock_function_info::@259 parameter_variables
#define SF_DEPARTURE_ORDERED
void parse_mission_info(mission *pm, bool basic=false)
void parse_object_clear_all_handled_flags()
int parse_main(const char *mission_name, int flags)
void dock_evaluate_all_docked_objects(object *objp, dock_function_info *infop, void(*function)(object *, dock_function_info *))
void RemHookVars(unsigned int num,...)
void parse_briefing_info(mission *pm)
char substitute_briefing_music_name[NAME_LENGTH]
char ship_list_variables[MAX_SHIP_CLASSES][TOKEN_LENGTH]
int pp_collide_any(vec3d *curpos, vec3d *goalpos, float radius, object *ignore_objp1, object *ignore_objp2, int big_only_flag)
#define MULTIPLAYER_MASTER
#define MAX_REINFORCEMENTS
int stuff_vec3d_list(vec3d *vlp, int max_vecs)
void ai_add_wing_goal_sexp(int sexp, int type, int wingnum)
char * Ship_class_names[MAX_SHIP_CLASSES]
SCP_vector< ship_info > Ship_info
#define OF_FLAK_PROTECTED
float ship_max_shield_strength
void init_ai_system(void)
#define SIF_KNOSSOS_DEVICE
struct p_dock_function_info::@259 maintained_variables
#define SF_NO_ARRIVAL_MUSIC
#define P_SF_IGNORE_COUNT
#define SF2_AFTERBURNER_LOCKED
int get_reassigned_index(team_data *current_team, int ship_class)
char TVT_wing_names[MAX_TVT_WINGS][NAME_LENGTH]
char * sexp_error_message(int num)
void position_ship_for_knossos_warpin(p_object *p_objp)
int ai_profile_lookup(char *name)
char * Old_game_types[OLD_MAX_GAME_TYPES]
int static_rand(int num)
Return a pseudo random 32 bit value given a reasonably small number.
#define timestamp_elapsed(stamp)
#define MAX_ASTEROID_FIELDS
#define ICON_TRANSPORT_WING
SCP_vector< float > shield_quadrant
SCP_vector< species_info > Species_info
void set_cue_to_false(int *cue)
char wave_filename[MAX_FILENAME_LEN]
#define OF_SHOULD_BE_DEAD
#define P2_SF2_PRIMITIVE_SENSORS
char mission_desc[MISSION_DESC_LENGTH]
int ship_get_default_orders_accepted(ship_info *sip)
#define list_remove(head, elem)
void error_display(int error_level, char *format,...)
void ignore_white_space()
#define SF2_ALWAYS_DEATH_SCREAM
#define MAX_MISSION_EVENTS
#define MULTI_END_ERROR_WAVE_COUNT
void parse_dock_one_docked_object(p_object *pobjp, p_object *parent_pobjp)
SCP_vector< sexp_variable > variables
void red_alert_invalidate_timestamp()
char message[MAX_GOAL_TEXT]
debriefing Debriefings[MAX_TVT_TEAMS]
GLenum GLuint GLenum GLsizei length
void SetAlphaColor(int r, int g, int b, int alpha)
void ship_add_ship_type_count(int ship_info_index, int num)
debris_genre_t debris_genre
char yes_messages[MAX_REINFORCEMENT_MESSAGES][NAME_LENGTH]
#define timestamp_rand(a, b)
matrix Parse_viewer_orient
bool sexp_is_locked_false(int node)
p_object Ship_arrival_list
team_data Team_data[MAX_TVT_TEAMS]
cmd_brief * Cur_cmd_brief
#define SCORE_DEBRIEF_SUCCESS
int Default_command_persona
void mission_eval_departures()
#define SF_CARGO_REVEALED
#define MAX_ARRIVAL_NAMES
#define P_SF_NO_ARRIVAL_WARP
char variable_name[TOKEN_LENGTH]
int event_music_get_spooled_music_index(const char *name)
void stuff_ubyte(ubyte *i)
int bm_load_either(const char *filename, int *nframes, int *fps, int *keyframe, int can_drop_frames, int dir_type)
Loads either animation (bm_load_animation) or still image (bm_load)
SCP_vector< starfield_list_entry > bitmaps
int ship_index[MAX_SHIPS_PER_WING]
#define P_SF_NO_DEPARTURE_WARP
#define P2_OF_FORCE_SHIELDS_ON
#define MISSION_LOADOUT_WEAPON_LIST
#define P_SF_USE_UNIQUE_ORDERS
void multi_set_network_signature(ushort signature, int what_kind)
void mission_parse_reset_callsign()
int optional_string_one_of(int arg_count,...)
SCP_map< SCP_string, team_color > Team_Colors
float fvi_ray_plane(vec3d *new_pnt, const vec3d *plane_pnt, const vec3d *plane_norm, const vec3d *ray_origin, const vec3d *ray_direction, float rad)
#define SF2_PRIMITIVE_SENSORS
asteroid_field Asteroid_field
ushort multi_assign_network_signature(int what_kind)
SCP_vector< texture_replace > Fred_texture_replacements
subsys_status * Subsys_status
#define MAX_ICON_TEXT_LEN
int ship_name_lookup(const char *name, int inc_players)
char envmap_name[MAX_FILENAME_LEN]
void waypoint_create_game_objects()
char Arriving_repair_targets[MAX_AI_GOALS][NAME_LENGTH]
#define NUM_NEBULA_COLORS
char filename[MAX_FILENAME_LEN]
void mission_add_to_arriving_support(object *requester_objp)
int parse_wing_create_ships(wing *wingp, int num_to_create, int force, int specific_instance)
Tries to create a wing of ships.
int ship_get_random_team_ship(int team_mask, int flags, float max_dist)
#define ARRIVE_FROM_DOCK_BAY
#define SF2_NAVPOINT_NEEDSLINK
int cfclose(CFILE *cfile)
char no_messages[MAX_REINFORCEMENT_MESSAGES][NAME_LENGTH]
int Mission_departure_timestamp
void _cdecl void void _cdecl void _cdecl void _cdecl void _cdecl int Global_warning_count
int get_warp_in_pos(vec3d *pos, object *objp, float x, float y, float z)
support_ship_info support_ships
void ai_copy_mission_wing_goal(ai_goal *aigp, ai_info *aip)
#define SF_FROM_PLAYER_WING
void parse_cmd_brief(mission *pm)
int parse_create_object(p_object *pobjp)
char label[MAX_LABEL_LEN]
#define SF2_SECONDARIES_LOCKED
#define P2_SF2_ALWAYS_DEATH_SCREAM
float max_shield_recharge
char * Nebula_colors[NUM_NEBULA_COLORS]
int parse_object(mission *pm, int flag, p_object *p_objp)
int timer_get_milliseconds()
int status_type[MAX_OBJECT_STATUS]
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
#define DEPARTURE_TIMESTAMP
void hud_add_remove_ship_escort(int objnum, int supress_feedback)
#define timestamp_valid(stamp)
#define P_SF2_DONT_COLLIDE_INVIS
int Mission_alt_type_count
float max_subsys_repair_val
void get_absolute_wing_pos(vec3d *result_pos, object *leader_objp, int wing_index, int formation_object_flag)
ushort netmisc_calc_checksum(void *vptr, int len)
int skip_to_string(char *pstr, char *end)
float static_randf(int num)
Return a random float in 0.0f .. 1.0f- (ie, it will never return 1.0f).
int cfilelength(CFILE *cfile)
char ship_name[NAME_LENGTH]
p_dock_instance * dock_list
int special_exp_shockwave_speed
char * Status_type_names[MAX_STATUS_NAMES]
char docker_point[NAME_LENGTH]
p_object Support_ship_pobj
int skip_to_start_of_string(char *pstr, char *end)
void nebl_set_storm(char *name)
void clear_texture_replacements()
int ai_acquire_emerge_path(object *pl_objp, int parent_objnum, int path_mask, vec3d *pos, vec3d *fvec)
#define LOG_SELF_DESTRUCTED
#define MISSION_TEXT_SIZE
#define SW_FLAG_BEAM_FREE
void parse_wing(mission *pm)
#define P2_ALREADY_HANDLED
char new_texture[MAX_FILENAME_LEN]
#define MAX_DEBRIEF_STAGES
#define MESSAGE_TIME_SOON
void update_loadout_totals(team_data *current_team, int loadout_index)
ai_goal ai_goals[MAX_AI_GOALS]
#define REPAIR_INFO_WARP_REMOVE
char wing_status_wing_pos
p_object * Player_start_pobject
float vm_vec_normalize(vec3d *v)
#define OF_BEAM_PROTECTED
char substitute_event_music_name[NAME_LENGTH]
int ship_list[MAX_SHIP_CLASSES]
#define SEXP_VARIABLE_PLAYER_PERSISTENT
#define MISSION_TYPE_MULTI_TEAMS
void parse_object_mark_dock_leader_helper(p_object *pobjp, p_dock_function_info *infop)
void resolve_path_masks(int anchor, int *path_mask)
char * Arrival_location_names[MAX_ARRIVAL_NAMES]
int parse_object_on_arrival_list(p_object *pobjp)
void mission_parse_remove_callsign(const char *name)