FS2_Open
Open source remastering of the Freespace 2 engine
missionload.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) Volition, Inc. 1999. All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 
11 
12 #include "cfile/cfilesystem.h"
13 #include "freespace2/freespace.h"
15 #include "globalincs/alphacolors.h"
16 #include "hud/hudparse.h"
17 #include "io/key.h"
19 #include "mission/missionload.h"
20 #include "mission/missionparse.h"
22 #include "playerman/managepilot.h"
23 #include "ui/ui.h"
24 
25 
26 
27 extern mission The_mission; // need to send this info to the briefing
28 extern int shifted_ascii_table[];
29 extern int ascii_table[];
30 
31 // -----------------------------------------------
32 // For recording most recent missions played
33 // -----------------------------------------------
36 
37 
38 // -----------------------------------------------------
39 // ml_update_recent_missions()
40 //
41 // Update the Recent_missions[][] array
42 //
44 {
46  int i,j;
47 
48 
49  for ( i = 0; i < Num_recent_missions; i++ ) {
50  strcpy_s( tmp[i], Recent_missions[i] );
51  }
52 
53  // get a pointer to just the basename of the filename (including extension)
54  p = strrchr(filename, DIR_SEPARATOR_CHAR);
55  if ( p == NULL ) {
56  p = filename;
57  } else {
58  p++;
59  }
60 
61  Assert(strlen(p) < MAX_FILENAME_LEN);
62  strcpy_s( Recent_missions[0], p );
63 
64  j = 1;
65  for ( i = 0; i < Num_recent_missions; i++ ) {
66  if ( stricmp(Recent_missions[0], tmp[i]) ) {
67  strcpy_s(Recent_missions[j++], tmp[i]);
68  if ( j >= MAX_RECENT_MISSIONS ) {
69  break;
70  }
71  }
72  }
73 
74  Num_recent_missions = j;
75  Assert(Num_recent_missions <= MAX_RECENT_MISSIONS);
76 }
77 
78 // Mission_load takes no parameters.
79 // It sets the following global variables
80 // Game_current_mission_filename
81 
82 // returns -1 if failed, 0 if successful
83 int mission_load(char *filename_ext)
84 {
85  char filename[MAX_PATH_LEN], *ext;
86 
87  if ( (filename_ext != NULL) && (Game_current_mission_filename != filename_ext) )
88  strncpy(Game_current_mission_filename, filename_ext, MAX_FILENAME_LEN-1);
89 
90  mprintf(("MISSION LOAD: '%s'\n", filename_ext));
91 
92  strcpy_s( filename, filename_ext );
93  ext = strrchr(filename, '.');
94  if (ext) {
95  mprintf(( "Hmmm... Extension passed to mission_load...\n" ));
96  *ext = 0; // remove any extension!
97  }
98 
99  strcat_s(filename, FS_MISSION_FILE_EXT);
100 
101  // does the magical mission parsing
102  // creates all objects, except for the player object
103  // save the player object later since the player may get
104  // to choose the type of ship that he is to fly
105  // return value of 0 indicates success, other is failure.
106 
107  if ( parse_main(filename) )
108  return -1;
109 
110  if (Select_default_ship) {
111  int ret;
113  Assert(!ret);
114  }
115 
116  ml_update_recent_missions(filename_ext); // update recently played missions list (save the csg later)
117 
118  init_hud();
119  return 0;
120 }
121 
122 //====================================
123 // Mission Load Menu stuff
124 #define MLM_MAX_MISSIONS 256
130 
136 int mlm_nfiles = 0;
137 static int last_recent_current = -1;
138 static int last_mlm_current = -1;
139 static int Campaign_filter_index;
140 
142 int jtmp_nfiles = 0;
143 
144 
146 {
147  if ( !Num_recent_missions || !mlm_nfiles )
148  return;
149 
150  if ( mlm_mission_list.current() != -1 ) {
151  mlm_mission_list.set_current(-1);
152  last_mlm_current = -1;
153  recent_mission_list.set_focus();
154  recent_mission_list.set_current(0);
155  return;
156  }
157 
158  if ( recent_mission_list.current() != -1 ) {
159  recent_mission_list.set_current(-1);
160  last_recent_current = -1;
161  mlm_mission_list.set_focus();
162  mlm_mission_list.set_current(0);
163  return;
164  }
165 }
166 
167 static char Campaign_missions[MAX_CAMPAIGN_MISSIONS][NAME_LENGTH];
168 static char Campaign_name_list[MAX_CAMPAIGNS+2][NAME_LENGTH];
169 static int Num_campaign_missions;
170 
171 // get the mission filenames that make up a campaign
172 extern int mission_campaign_get_filenames(char *filename, char dest[][NAME_LENGTH], int *num);
173 
175 {
176  int i;
177  char wild_card[256];
178  Assert( mlm_active == 0 );
179  mlm_active = 1;
180 
181  memset(wild_card, 0, 256);
182  strcpy_s(wild_card, NOX("*"));
183  strcat_s(wild_card, FS_MISSION_FILE_EXT);
185  jtmp_nfiles = 0;
186 
188 
189  mlm_window.create( 100,100,500,300, 0 ); //WIN_DIALOG
190 
191  mlm_ok.create( &mlm_window, NOX("Ok"), 125, 420, 80, 40 );
192  mlm_cancel.create( &mlm_window, NOX("Cancel"), 250, 420, 80, 40 );
193  mlm_cancel.set_hotkey( KEY_ESC );
194 
195  mlm_mission_list.create( &mlm_window, 450, 150, 150, 200, mlm_nfiles, mlm_missions );
196 
197  for ( i = 0; i < Num_recent_missions; i++ ) {
199  }
200  recent_mission_list.create( &mlm_window, 250, 150, 150, 200, Num_recent_missions, recent_missions );
201 
202  mlm_mission_list.set_focus();
203  mlm_mission_list.set_current(0);
204 
205 
207  for ( i = 0; i < Num_campaigns; i++ ) {
208  strcpy_s(Campaign_name_list[i+1], Campaign_names[i]);
209  }
210  strcpy_s(Campaign_name_list[0], NOX("All campaigns"));
211  strcpy_s(Campaign_name_list[1], NOX("Player Missions"));
212 
213  for ( i = 0; i < Num_campaigns+2; i++ ) {
214  campaign_names[i] = Campaign_name_list[i];
215  }
216 
217  campaign_filter.create( &mlm_window, 50, 150, 150, 200, Num_campaigns+2, campaign_names );
218  Campaign_filter_index = 0;
219  campaign_filter.set_current(Campaign_filter_index);
220 }
221 
223 {
224  int selected, key_in, recent_current, mlm_current, use_recent_flag, i;
225 
226 
227  Assert( mlm_active == 1 );
228 
229  key_in = mlm_window.process();
230 
231  if ( key_in ) {
232 
233  switch ( key_in & KEY_MASK ) {
234 
235  case KEY_UP:
236  case KEY_DOWN:
237  case KEY_HOME:
238  case KEY_END:
239  case KEY_PAGEUP:
240  case KEY_PAGEDOWN:
241  case KEY_ENTER:
242  break;
243 
244  case KEY_RIGHT:
245  case KEY_LEFT:
247  break;
248 
249  case KEY_ESC:
251  break;
252 
253  default:
254  break;
255 
256  } // end switch
257 
258  }
259 
260  if ( campaign_filter.current() != Campaign_filter_index ) {
261  Campaign_filter_index = campaign_filter.current();
262 
263  if ( Campaign_filter_index > 1 ) {
264  mission_campaign_get_filenames(Campaign_file_names[Campaign_filter_index-2], Campaign_missions, &Num_campaign_missions);
265 
266  for ( i = 0; i < Num_campaign_missions; i++ ) {
267  campaign_missions[i] = Campaign_missions[i];
268  }
269  mlm_mission_list.set_new_list(Num_campaign_missions, campaign_missions);
270  } else if ( Campaign_filter_index == 0 ) {
271  mlm_mission_list.set_new_list(mlm_nfiles, mlm_missions);
272  } else if ( Campaign_filter_index == 1 ) {
273  mlm_mission_list.set_new_list(jtmp_nfiles, jtmp_missions);
274  }
275  }
276 
277  mlm_current = mlm_mission_list.current();
278  recent_current = recent_mission_list.current();
279 
280  if ( mlm_current != last_mlm_current ) {
281  recent_mission_list.set_current(-1);
282  last_recent_current = -1;
283  }
284  last_mlm_current = mlm_current;
285 
286  if ( recent_current != last_recent_current ) {
287  mlm_mission_list.set_current(-1);
288  last_mlm_current = -1;
289  }
290  last_recent_current = recent_current;
291 
292  if (mlm_cancel.pressed())
294 
295  // Check if they hit OK, if so, use the current listbox
296  // selection.
297  selected = -1;
298  use_recent_flag = 0;
299  if (mlm_ok.pressed()) {
300  selected = mlm_mission_list.current();
301  if ( selected == -1 ) {
302  selected = recent_mission_list.current();
303  use_recent_flag = 1;
304  }
305  } else {
306  // If they didn't hit OK, then check for a double-click on
307  // a list box item.
308  selected = mlm_mission_list.selected();
309  if ( selected == -1 ) {
310  selected = recent_mission_list.selected();
311  use_recent_flag = 1;
312  }
313  }
314 
315  char mission_name_final[512] = "";
316 
317  if ( selected > -1 ) {
319  if ( use_recent_flag ) {
320  strncpy( mission_name_final, recent_missions[selected], MAX_FILENAME_LEN );
321  } else {
322  char mission_name[NAME_LENGTH];
323  if ( Campaign_filter_index == 0 ) {
324  strcpy_s(mission_name, mlm_missions[selected]);
325  } else if (Campaign_filter_index == 1 ) {
326  strcpy_s( mission_name, jtmp_missions[selected]);
327  } else {
328  strcpy_s(mission_name, Campaign_missions[selected]);
329  }
330  strncpy( mission_name_final, mission_name, MAX_FILENAME_LEN );
331  }
332 
333  // go
334  strcpy_s(Game_current_mission_filename, mission_name_final);
335  mprintf(( "Selected '%s'\n", Game_current_mission_filename ));
337  }
338 
339  gr_clear();
341  gr_printf_menu( 0x8000, 10, NOX("Select Mission") );
342 
343  gr_printf_menu( 50, 135, NOX("Campaign Filter"));
344  gr_printf_menu( 250, 135, NOX("Recently Played"));
345  gr_printf_menu( 450, 135, NOX("Mission List"));
346  mlm_window.draw();
347 
348  gr_flip();
349 }
350 
352 {
353  int i;
354 
355  Assert( mlm_active == 1 );
356  mlm_active = 0;
357 
358  for (i=0; i<mlm_nfiles; i++ ) {
359  if (mlm_missions[i] ) {
360  vm_free(mlm_missions[i]);
361  mlm_missions[i] = NULL;
362  }
363  }
364 
365  for (i=0; i<jtmp_nfiles; i++ ) {
366  if (jtmp_missions[i] ) {
368  jtmp_missions[i] = NULL;
369  }
370  }
371 
372 
373  mlm_window.destroy();
374 
375 }
376 
#define MAX_FILENAME_LEN
Definition: pstypes.h:324
UI_BUTTON mlm_ok
#define FS_MISSION_FILE_EXT
Definition: missionparse.h:25
int i
Definition: multi_pxo.cpp:466
#define vm_free(ptr)
Definition: pstypes.h:548
char * Campaign_names[MAX_CAMPAIGNS]
#define gr_clear
Definition: 2d.h:749
#define KEY_DOWN
Definition: key.h:180
#define KEY_LEFT
Definition: key.h:181
void gr_flip()
Definition: 2d.cpp:2113
char Recent_missions[MAX_RECENT_MISSIONS][MAX_FILENAME_LEN]
Definition: missionload.cpp:34
char Game_current_mission_filename[MAX_FILENAME_LEN]
Definition: fredstubs.cpp:26
#define KEY_PAGEDOWN
Definition: key.h:178
char * recent_missions[MAX_RECENT_MISSIONS]
UI_LISTBOX campaign_filter
#define KEY_RIGHT
Definition: key.h:182
void ml_change_listbox()
int mission_load(char *filename_ext)
Definition: missionload.cpp:83
Assert(pm!=NULL)
#define mprintf(args)
Definition: pstypes.h:238
#define DIR_SEPARATOR_CHAR
Definition: pstypes.h:43
void create(UI_WINDOW *wnd, int _x, int _y, int _w, int _h, int _numitem, char **_list, char *_check_list=NULL, int _max_items=-1)
Definition: listbox.cpp:51
void init_hud()
Definition: hudparse.cpp:623
void set_focus()
Definition: gadget.cpp:321
int shifted_ascii_table[]
Definition: key.cpp:83
void mission_load_menu_close()
int mission_campaign_get_filenames(char *filename, char dest[][NAME_LENGTH], int *num)
void gr_set_color_fast(color *dst)
Definition: 2d.cpp:1197
#define KEY_PAGEUP
Definition: key.h:175
Definition: ui.h:195
int Num_recent_missions
Definition: missionload.cpp:35
UI_WINDOW mlm_window
UI_BUTTON mlm_cancel
int create_default_player_ship(int use_last_flown)
void destroy()
Definition: window.cpp:189
color Color_bright
Definition: alphacolors.cpp:28
void set_current(int _index)
Definition: listbox.cpp:476
char * filename
int pressed()
Definition: button.cpp:325
#define MAX_CAMPAIGNS
UI_LISTBOX recent_mission_list
#define KEY_ENTER
Definition: key.h:125
int ascii_table[]
Definition: key.cpp:72
char * campaign_names[MAX_CAMPAIGNS+2]
int jtmp_nfiles
#define NOX(s)
Definition: pstypes.h:473
#define KEY_END
Definition: key.h:177
void set_hotkey(int keycode)
Definition: gadget.cpp:280
#define MAX_PATH_LEN
Definition: pstypes.h:325
int current_mission
GLuint GLuint num
Definition: Glext.h:9089
char * mlm_missions[MLM_MAX_MISSIONS]
campaign Campaign
#define strcat_s(...)
Definition: safe_strings.h:68
void create(UI_WINDOW *wnd, char *_text, int _x, int _y, int _w, int _h, int do_repeat=0, int ignore_focus=0)
Definition: button.cpp:26
#define KEY_ESC
Definition: key.h:124
#define NAME_LENGTH
Definition: globals.h:15
char * jtmp_missions[MLM_MAX_MISSIONS]
void create(int _x, int _y, int _w, int _h, int _flags, int _f_id=-1)
Definition: window.cpp:140
#define MLM_MAX_MISSIONS
#define KEY_MASK
Definition: key.h:67
Definition: ui.h:584
#define CF_SORT_NAME
Definition: cfile.h:93
void mission_load_menu_init()
int parse_main(const char *mission_name, int flags)
#define CF_TYPE_MISSIONS
Definition: cfile.h:74
GLfloat GLfloat p
Definition: Glext.h:8373
int selected()
Definition: listbox.cpp:462
int mlm_nfiles
void set_new_list(int _numitems, char **_list)
Definition: listbox.cpp:507
#define MAX_CAMPAIGN_MISSIONS
#define KEY_UP
Definition: key.h:179
void ml_update_recent_missions(char *filename)
Definition: missionload.cpp:43
void mission_campaign_build_list(bool desc, bool sort, bool multiplayer)
char * campaign_missions[MAX_CAMPAIGN_MISSIONS]
#define KEY_HOME
Definition: key.h:174
void mission_load_menu_do()
mission The_mission
int Num_campaigns
void draw()
Definition: window.cpp:220
#define MAX_RECENT_MISSIONS
Definition: missionload.h:20
UI_LISTBOX mlm_mission_list
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)
int process(int key_in=-1, int process_mouse=1)
Definition: window.cpp:401
void _cdecl gr_printf_menu(int x, int y, const char *format,...)
Definition: font.cpp:314
void gameseq_post_event(int event)
Definition: ui.h:522
int current()
Definition: listbox.cpp:471
char * Campaign_file_names[MAX_CAMPAIGNS]
#define stricmp(s1, s2)
Definition: config.h:271
int Select_default_ship
int mlm_active
#define strcpy_s(...)
Definition: safe_strings.h:67