68 static bool MC_desc =
false;
69 static bool MC_multiplayer =
false;
110 int fname_len = strlen(fname);
127 nprintf((
"Warning",
"No name found for campaign file %s\n", filename));
167 mprintf((
"MISSIONCAMPAIGN: Unable to parse '%s'! Error message = %s.\n", fname, e.what()));
204 mprintf((
"MISSIONCAMPAIGN: Unable to parse '%s'! Error message = %s.\n", filename, e.what()));
207 for (i = 0; i<
num; i++)
248 int type, max_players;
290 MC_multiplayer = multiplayer;
292 memset(wild_card, 0,
sizeof(wild_card));
322 if ( (name1 == NULL) || (name2 == NULL) ) {
333 if (
stricmp(name1, name2) > 0) {
385 for (i = 0; i < static_cast<int>(
Ship_info.size()); i++ )
391 for (i = 0; i <
count; i++ ) {
404 for (i = 0; i <
count; i++ )
458 len = strlen(filename) - 4;
460 strncpy(Campaign.
filename, filename, len);
479 if ( i == MAX_CAMPAIGN_TYPES )
482 Campaign.
desc = NULL;
545 mprintf((
"Substitute main hall '%s' not found\n", temp));
609 if ( cm->
level == 0 )
634 if (cm->
goals !=
nullptr) {
638 if (cm->
events !=
nullptr) {
652 mprintf((
"Error parsing '%s'\r\nError message = %s.\r\n", filename, e.what()));
714 int type,max_players;
717 if(filename[0] !=
'\0'){
718 if(strlen(filename) > 4){
719 strcpy_s(test,filename+(strlen(filename)-4));
727 Error(
LOCATION,
"Tried to load campaign file with illegal length/extension!");
843 _splitpath( cfilename, NULL, NULL, base, NULL );
877 sprintf(file_spec,
NOX(
"%s.*%s"), pilot_name, ext);
886 for (i=0; i<num_files; i++) {
887 strcpy_s(filename, names[i].c_str());
1009 nprintf((
"allender",
"No next mission to proceed to.\n"));
1028 mission_obj = &Campaign.
missions[cur];
1034 if ( mission_obj->
goals != NULL ) {
1036 mission_obj->
goals = NULL;
1060 if ( mission_obj->
events != NULL ) {
1062 mission_obj->
events = NULL;
1077 nprintf((
"Warning",
"Mission goal in mission %s must have a +Name field! using %s for campaign save file\n", mission_obj->
name, name));
1102 mission_obj = &Campaign.
missions[cur];
1112 if (num_mission_variables > 0) {
1113 int variable_count = 0;
1115 int matching_variables = 0;
1116 int persistent_variables_in_mission = 0;
1121 persistent_variables_in_mission++;
1126 matching_variables++;
1133 Assert(persistent_variables_in_mission >= matching_variables);
1134 total_variables += (persistent_variables_in_mission - matching_variables);
1187 Assert( variable_count == total_variables );
1220 Assert( mission_num != -1 );
1221 mission_obj = &Campaign.
missions[mission_num];
1267 if (mission_obj->
goals != NULL) {
1269 mission_obj->
goals = NULL;
1273 if (mission_obj->
events != NULL) {
1275 mission_obj->
events = NULL;
1289 if (do_next_mission)
1301 if (Campaign.
desc != NULL) {
1303 Campaign.
desc = NULL;
1432 mprintf((
"MISSIONCAMPAIGN: Unable to parse '%s'! Error message = %s.\n", filename, e.what()));
1447 int i,
z, event_count,
count = 0;
1487 sprintf(events[event_count],
NOX(
"Event #%d"), event_count + 1);
1515 sprintf(goals[count],
NOX(
"Goal #%d"), count + 1);
1533 for (i = 0; i <
count; i++){
1544 for (i = 0; i < event_count; i++){
1553 mprintf((
"MISSIONCAMPAIGN: Unable to parse '%s'! Error message = %s.\n", filename, e.what()));
1578 if ( strchr(name,
'.') == NULL ){
1603 Assert( mission_idx != -1 );
1658 mprintf((
"MISSIONCAMPAIGN: Unable to parse '%s'! Error message = %s.\n", filename, e.what()));
1689 if (ii->compare(filename_no_ext) == 0) {
1871 int i = 0, mission_num = -1;
1872 char dest_name[64], *
p;
1879 p = strchr(dest_name,
'.');
1889 }
else if (!no_skip) {
1895 if (mission_num < 0) {
1902 i =
static_cast<int>(std::distance(
Ship_info.begin(), it));
1965 "Please select a different campaign in the Campaign Room.", 1614));
1968 "Please select a different campaign in the Campaign Room.", 1615));
1974 "for this campaign is invalid for the current mod.\n\nPlease select another campaign or switch to the correct "
1975 "mod in order to use this campaign.", 1617));
#define CAMPAIGN_ERROR_IGNORED
void advance_to_eoln(char *more_terminators)
#define FS_MISSION_FILE_EXT
#define CAMPAIGN_TYPE_SINGLE
char * Campaign_names[MAX_CAMPAIGNS]
void mission_campaign_exit_loop()
int cf_delete(const char *filename, int path_type)
Delete the specified file.
#define CAMPAIGN_MOVIE_PRE_MISSION
char Game_current_mission_filename[MAX_FILENAME_LEN]
#define MAX_CAMPAIGN_TYPES
void mission_campaign_clear()
void campaign_delete_save(char *cfn, char *pname)
char * stuff_and_malloc_string(int type, char *terminators)
char * mission_branch_desc
LOCAL UI_BUTTON Campaign_cancelb
int mission_campaign_parse_is_multi(char *filename, char *name)
LOCAL UI_BUTTON Campaign_okb
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define CAMPAIGN_ERROR_CORRUPT
char filename[MAX_FILENAME_LEN]
void mission_campaign_delete_all_savefiles(char *pilot_name)
char * Campaign_descs[MAX_CAMPAIGNS]
ubyte debrief_persona_index
int weapon_pool[MAX_WEAPON_TYPES]
void flush_sexp_tree(int node)
LOCAL UI_WINDOW Campaign_window
char briefing_cutscene[NAME_LENGTH]
int sexp_campaign_persistent_variable_count()
int Campaign_load_failure
sexp_variable Sexp_variables[MAX_SEXP_VARIABLES]
void mission_campaign_end_do()
void mission_campaign_mission_over(bool do_next_mission)
std::basic_string< char, std::char_traits< char >, std::allocator< char > > SCP_string
#define CMISSION_FLAG_BASTION
int mission_campaign_get_info(const char *filename, char *name, int *type, int *max_players, char **desc)
ubyte ships_allowed[MAX_SHIP_CLASSES]
int required_string_either(char *str1, char *str2)
Checks for one of two required strings.
mission_goal Mission_goals[MAX_GOALS]
char callsign[CALLSIGN_LEN+1]
int Campaign_names_inited
void campaign_savefile_load(char *fname, char *pname)
int mission_campaign_get_filenames(char *filename, char dest[][NAME_LENGTH], int *num)
int wep_count[MAX_SHIP_WEAPONS]
sexp_variable * redalert_variables
void mission_campaign_skip_to_next(int start_game)
int Campaign_file_missing
player Players[MAX_PLAYERS]
#define FS_CAMPAIGN_FILE_EXT
int mission_campaign_maybe_add(const char *filename)
int mission_campaign_previous_mission()
void sexp_mark_persistent(int n)
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
void mission_campaign_maybe_play_movie(int type)
void mission_goal_mark_objectives_complete()
void scoring_backout_accept(scoring_struct *score)
void common_maybe_play_cutscene(int movie_type, bool restart_music, int music)
char current_campaign[MAX_FILENAME_LEN+1]
void mission_campaign_store_goals_and_events()
void scoring_level_close(int accepted)
#define CAMPAIGN_ERROR_SAVEFILE
ubyte weapons_allowed[MAX_WEAPON_TYPES]
main_hall_defines * main_hall_get_pointer(const SCP_string &name_to_find)
void mission_campaign_end_close()
void mission_campaign_end_init()
#define strnicmp(s1, s2, n)
mission_event Mission_events[MAX_MISSION_EVENTS]
void mission_campaign_get_sw_info()
void stuff_string(char *outstr, int type, int len, char *terminators)
void movie_play_two(char *name1, char *name2)
#define MISSION_FLAG_END_TO_MAINHALL
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
char Default_campaign_file_name[MAX_FILENAME_LEN-4]
#define CAMPAIGN_PERSISTENT_SHIP
wss_unit unit_data[MAX_WSS_SLOTS]
void sexp_unmark_persistent(int n)
int required_string(const char *pstr)
int optional_string(const char *pstr)
int failures_this_session
void read_file_text(const char *filename, int mode, char *processed_text, char *raw_text)
char * mission_branch_brief_anim
void mission_campaign_savefile_delete(char *cfilename)
void player_loadout_init()
int sexp_variable_count()
const char * XSTR(const char *str, int index)
int mission_campaign_find_mission(char *name)
int mission_load_up_campaign(player *pl)
sexp_variable * variables
void _splitpath(char *path, char *drive, char *dir, char *fname, char *ext)
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define CMISSION_FLAG_HAS_FORK
void mission_campaign_savefile_generate_root(char *filename, player *pl)
void reset_parse(char *text)
void assign(const scoring_struct &s)
GLuint const GLchar * name
void mission_goal_fail_incomplete()
char * mission_branch_brief_sound
char * cf_add_ext(const char *filename, const char *ext)
void mission_campaign_store_variables()
int stuff_int_list(int *ilp, int max_ints, int lookup_type)
#define CMISSION_FLAG_SKIPPED
void mission_campaign_eval_next_mission()
bool load_savefile(const char *campaign)
void mission_campaign_store_goals_and_events_and_variables()
int mission_campaign_load(char *filename, player *pl, int load_savefile, bool reset_stats)
int wep[MAX_SHIP_WEAPONS]
int mission_campaign_load_by_name_csfe(char *filename, char *callsign)
loadout_data Player_loadout
int eval_sexp(int cur_node, int referenced_node)
void read_mission_goal_list(int num)
int Campaign_ending_via_supernova
int mission_campaign_load_by_name(char *filename)
#define CAMPAIGN_ERROR_SEXP_EXHAUSTED
#define SEXP_VARIABLE_CAMPAIGN_PERSISTENT
void mission_campaign_jump_to_mission(char *name, bool no_skip)
void mission_campaign_init()
int mission_campaign_get_mission_list(const char *filename, char **list, int max)
SCP_vector< ship_info > Ship_info
LOCAL UI_LISTBOX Campaign_listbox
int mission_campaign_next_mission()
SCP_vector< SCP_string > Ignored_campaigns
bool movie_play(char *name)
#define MAX_MISSION_EVENTS
void mission_campaign_save_player_persistent_variables()
void mission_campaign_save_persistent(int type, int sindex)
SCP_vector< sexp_variable > variables
int campaign_savefile_save(char *pname)
void event_music_level_close()
#define CAMPAIGN_LOOP_MISSION_UNINITIALIZED
void cutscene_mark_viewable(char *filename)
char variable_name[TOKEN_LENGTH]
char filename[MAX_FILENAME_LEN]
void stuff_ubyte(ubyte *i)
void mission_campaign_build_list(bool desc, bool sort, bool multiplayer)
#define PLAYER_FLAGS_IS_MULTI
void mission_goal_mark_events_complete()
int Granted_weapons[MAX_WEAPON_TYPES]
bool drop_extension(char *str)
int num_missions_completed
int cf_get_file_list(SCP_vector< SCP_string > &list, int pathtype, const char *filter, int sort=CF_SORT_NONE, SCP_vector< file_list_info > *info=NULL)
#define CAMPAIGN_PERSISTENT_WEAPON
#define CAMPAIGN_ERROR_MISSING
sexp_variable * variables
void gameseq_post_event(int event)
#define CMISSION_FLAG_HAS_LOOP
char * Campaign_file_names[MAX_CAMPAIGNS]
bool campaign_is_ignored(const char *filename)
int ship_pool[MAX_SHIP_CLASSES]
char * campaign_types[MAX_CAMPAIGN_TYPES]
int skip_to_string(char *pstr, char *end)
int Granted_ships[MAX_SHIP_CLASSES]
void mission_campaign_free_list()
cmission missions[MAX_CAMPAIGN_MISSIONS]
int redalert_num_variables
int(* Get_file_list_filter)(const char *filename)
char last_modified[DATE_TIME_LENGTH]
void mission_campaign_load_failure_popup()
#define SEXP_VARIABLE_PLAYER_PERSISTENT
#define MOVIE_END_CAMPAIGN