startup windowed and disable movies with Emscripten
[taylor/freespace2.git] / src / cmdline / cmdline.cpp
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
6  * the source.
7  */
8
9 /*
10  * $Logfile: /Freespace2/code/Cmdline/cmdline.cpp $
11  * $Revision$
12  * $Date$
13  * $Author$
14  *
15  * $Log$
16  * Revision 1.7  2005/10/01 21:40:38  taylor
17  * deal with OS X apps a little better, sets the path only based on ".app" in the name rather than the name itself
18  * make sure a global cmdline.cfg file works with OS X when built as an app
19  *
20  * Revision 1.6  2003/06/22 12:50:11  taylor
21  * fix memory error, code cleanup
22  *
23  * Revision 1.5  2003/05/06 07:20:14  taylor
24  * implement command line options
25  *
26  * Revision 1.4  2002/06/21 03:34:05  relnev
27  * implemented a stub and fixed a path
28  *
29  * Revision 1.3  2002/06/09 04:41:15  relnev
30  * added copyright header
31  *
32  * Revision 1.2  2002/05/07 03:16:43  theoddone33
33  * The Great Newline Fix
34  *
35  * Revision 1.1.1.1  2002/05/03 03:28:08  root
36  * Initial import.
37  *
38  * 
39  * 8     8/26/99 8:51p Dave
40  * Gave multiplayer TvT messaging a heavy dose of sanity. Cheat codes.
41  * 
42  * 7     7/15/99 3:07p Dave
43  * 32 bit detection support. Mouse coord commandline.
44  * 
45  * 6     7/13/99 1:15p Dave
46  * 32 bit support. Whee!
47  * 
48  * 5     6/22/99 9:37p Dave
49  * Put in pof spewing.
50  * 
51  * 4     1/12/99 5:45p Dave
52  * Moved weapon pipeline in multiplayer to almost exclusively client side.
53  * Very good results. Bandwidth goes down, playability goes up for crappy
54  * connections. Fixed object update problem for ship subsystems.
55  * 
56  * 3     11/17/98 11:12a Dave
57  * Removed player identification by address. Now assign explicit id #'s.
58  * 
59  * 2     10/07/98 10:52a Dave
60  * Initial checkin.
61  * 
62  * 1     10/07/98 10:48a Dave
63  * 
64  * 38    10/02/98 3:22p Allender
65  * fix up the -connect option and fix the -port option
66  * 
67  * 37    9/15/98 4:04p Allender
68  * added back in the -ip_addr command line switch because it needs to be
69  * in the standalone server only executable
70  * 
71  * 36    9/14/98 11:52a Allender
72  * don't use cfile
73  * 
74  * 35    9/14/98 11:28a Allender
75  * support for server bashing of address when received from client.  Added
76  * a cmdline.cfg file to process command line arguments from a file
77  * 
78  * 34    9/08/98 2:20p Allender
79  * temporary code to force IP address to a specific value.
80  * 
81  * 33    8/20/98 5:30p Dave
82  * Put in handy multiplayer logfile system. Now need to put in useful
83  * applications of it all over the code.
84  * 
85  * 32    8/07/98 10:39a Allender
86  * fixed debug standalone problem where stats would continually get sent
87  * to tracker.  more debug code to help find stats problem
88  * 
89  * 31    7/24/98 11:14a Allender
90  * start of new command line options for version 1.04
91  * 
92  * 30    5/21/98 1:50a Dave
93  * Remove obsolete command line functions. Reduce shield explosion packets
94  * drastically. Tweak PXO screen even more. Fix file xfer system so that
95  * we can guarantee file uniqueness.
96  * 
97  * 29    5/18/98 9:10p Dave
98  * Put in many new PXO features. Fixed skill level bashing in multiplayer.
99  * Removed several old command line options. Put in network config files.
100  * 
101  * 28    5/09/98 7:16p Dave
102  * Put in CD checking. Put in standalone host password. Made pilot into
103  * popup scrollable.
104  * 
105  * 27    4/23/98 8:27p Allender
106  * basic support for cutscene playback.  Into movie code in place.  Tech
107  * room can view cutscenes stored in CDROM_dir variable
108  * 
109  * 26    4/09/98 5:43p Dave
110  * Remove all command line processing from the demo. Began work fixing up
111  * the new multi host options screen.
112  * 
113  * 25    4/02/98 11:40a Lawrance
114  * check for #ifdef DEMO instead of #ifdef DEMO_RELEASE
115  * 
116  * 24    4/01/98 5:56p Dave
117  * Fixed a messaging bug which caused msg_all mode in multiplayer not to
118  * work. Compile out a host of multiplayer options not available in the
119  * demo.
120  * 
121  * 23    3/14/98 2:48p Dave
122  * Cleaned up observer joining code. Put in support for file xfers to
123  * ingame joiners (observers or not). Revamped and reinstalled pseudo
124  * lag/loss system.
125  * 
126  * 22    2/22/98 12:19p John
127  * Externalized some strings
128  * 
129  * 21    1/31/98 4:32p Dave
130  * Put in new support for VMT player validation, game logging in and game
131  * logging out.
132  * 
133  * 20    12/10/97 4:45p Dave
134  * Added in more detailed support for multiplayer packet lag/loss. Fixed
135  * some multiplayer stuff. Added some controls to the standalone.
136  * 
137  * 19    12/09/97 6:14p Lawrance
138  * add -nomusic flag
139  * 
140  * 18    12/01/97 5:10p Dave
141  * Fixed a syntax bug.
142  * 
143  * 17    12/01/97 4:59p Dave
144  * Synchronized multiplayer debris objects. Put in pilot popup in main
145  * hall. Optimized simulated multiplayer lag module. Fixed a potential
146  * file_xfer bug.
147  * 
148  * 16    11/28/97 7:04p Dave
149  * Emergency checkin due to big system crash.
150  * 
151  * 15    11/28/97 5:06p Dave
152  * Put in facilities for simulating multiplayer lag.
153  * 
154  * 14    11/24/97 5:42p Dave
155  * Fixed a file xfer buffer free/malloc problem. Lengthened command line
156  * switch string parse length.
157  * 
158  * 13    11/12/97 4:39p Dave
159  * Put in multiplayer campaign support parsing, loading and saving. Made
160  * command-line variables better named. Changed some things on the initial
161  * pilot select screen.
162  * 
163  * 12    11/11/97 4:54p Dave
164  * Put in support for single vs. multiplayer pilots. Put in initial player
165  * selection screen (no command line option yet). Started work on
166  * multiplayer campaign file save gaming.
167  * 
168  * 11    11/11/97 11:55a Allender
169  * initialize network at beginning of application.  create new call to set
170  * which network protocol to use
171  * 
172  * 10    9/18/97 10:12p Dave
173  * Added -gimmemedals, which gives the current pilot all the medals in the
174  * game (debug)
175  * 
176  * 9     9/18/97 9:20a Dave
177  * Minor modifications
178  * 
179  * 8     9/15/97 11:40p Lawrance
180  * remove demo granularity switch
181  * 
182  * 7     9/09/97 3:39p Sandeep
183  * warning level 4 bugs
184  * 
185  * 6     9/03/97 5:03p Lawrance
186  * add support for -nosound command line parm
187  * 
188  * 5     8/22/97 8:52a Dave
189  * Removed a return statement which would have broken the parser out too
190  * early.
191  * 
192  * 4     8/21/97 4:55p Dave
193  * Added a switch for multiplayer chat streaming. Added a section for
194  * global command line vars.
195  * 
196  * 3     8/06/97 2:26p Dave
197  * Made the command line parse more robust. Made it easier to add and
198  * process new command-line switches.
199  * 
200  * 2     8/04/97 3:13p Dave
201  * Added command line functions. See cmdline.cpp for directions on adding
202  * new switches
203  * 
204  * 1     8/04/97 9:58a Dave
205  * 
206  * $NoKeywords: $
207  */
208
209 #include <string.h>
210 #include <stdlib.h>
211 #include <new>
212 #include "cmdline.h"
213 #include "linklist.h"
214 #include "systemvars.h"
215 #include "multi.h"
216 #include "cfile.h"
217 #include "osapi.h"
218 #include "osregistry.h"
219 #include "version.h"
220 #include "cfile.h"
221 #include "cfilesystem.h"
222
223 // variables
224 class cmdline_parm {
225 public:
226         cmdline_parm *next, *prev;
227         const char *name;                                               // name of parameter, must start with '-' char
228         const char *name2;                                      // name - alternate
229         const char *help;                                               // help text for this parameter
230         char *args;                                             // string value for parameter arguements (NULL if no arguements)
231         int name_found;                         // true if parameter on command line, otherwise false
232
233         cmdline_parm(const char *name, const char *name2, const char *help);
234         ~cmdline_parm();
235         int found();
236         int get_int();
237         float get_float();
238         char *str();
239 };
240
241 // here are the command line parameters that we will be using for FreeSpace
242 cmdline_parm standalone_arg("-standalone", "-d", NULL);
243 cmdline_parm nosound_arg("-nosound", "-s", NULL);
244 cmdline_parm nomusic_arg("-nomusic", NULL, NULL);
245 cmdline_parm startgame_arg("-startgame", "-S", NULL);
246 cmdline_parm gamename_arg("-gamename", "-N", NULL);
247 cmdline_parm gamepassword_arg("-password", "-p", NULL);
248 cmdline_parm gameclosed_arg("-closed", "-c", NULL);
249 cmdline_parm gamerestricted_arg("-restricted", "-r", NULL);
250 cmdline_parm allowabove_arg("-allowabove", "-a", NULL);
251 cmdline_parm allowbelow_arg("-allowbelow", "-b", NULL);
252 cmdline_parm port_arg("-port", "-o", NULL);
253 cmdline_parm connect_arg("-connect", "-C", NULL);
254 cmdline_parm multilog_arg("-multilog", "-m", NULL);
255 cmdline_parm server_firing_arg("-oldfire", "-F", NULL);
256 cmdline_parm client_dodamage("-clientdamage", "-D", NULL);
257 cmdline_parm pof_spew("-pofspew", "-P", NULL);
258 cmdline_parm d3d_32bit("-32bit", NULL, NULL);
259 cmdline_parm mouse_coords("-coords", "-M", NULL);
260 cmdline_parm timeout("-timeout", "-t", NULL);
261 cmdline_parm d3d_window("-window", "-w", NULL);
262 cmdline_parm d3d_fullscreen("-fullscreen", "-f", NULL);
263 cmdline_parm help("-help", "-h", NULL);
264 cmdline_parm fs_version("-version", "-v", NULL);
265 cmdline_parm no_movies("-nomovies", "-n", NULL);
266 cmdline_parm std_daemon("-daemon", NULL, NULL);
267
268
269 int Cmdline_multi_stream_chat_to_file = 0;
270 int Cmdline_freespace_no_sound = 0;
271 int Cmdline_freespace_no_music = 0;
272 int Cmdline_gimme_all_medals = 0;
273 int Cmdline_use_last_pilot = 0;
274 int Cmdline_multi_protocol = -1;
275 int Cmdline_cd_check = 1;
276 int Cmdline_start_netgame = 0;
277 int Cmdline_closed_game = 0;
278 int Cmdline_restricted_game = 0;
279 int Cmdline_network_port = -1;
280 char *Cmdline_game_name = NULL;
281 char *Cmdline_game_password = NULL;
282 char *Cmdline_rank_above= NULL;
283 char *Cmdline_rank_below = NULL;
284 char *Cmdline_connect_addr = NULL;
285 int Cmdline_multi_log = 0;
286 int Cmdline_server_firing = 0;
287 int Cmdline_client_dodamage = 0;
288 int Cmdline_spew_pof_info = 0;
289 int Cmdline_force_32bit = 0;
290 int Cmdline_mouse_coords = 0;
291 int Cmdline_timeout = -1;
292 int Cmdline_play_movies = 1;
293 int Cmdline_fullscreen = 0;
294 int Cmdline_window = 0;
295
296 static cmdline_parm Parm_list(NULL, NULL, NULL);
297
298 static int Parm_list_inited = 0;
299
300
301 //      Return true if this character is an extra char (white space and quotes)
302 static int is_extra_space(char ch)
303 {
304         return ((ch == ' ') || (ch == '\t') || (ch == 0x0a) || (ch == '\'') || (ch == '\"'));
305 }
306
307
308 // eliminates all leading and trailing extra chars from a string.  Returns pointer passed in.
309 static char *drop_extra_chars(char *str)
310 {
311         int s, e;
312
313         s = 0;
314         while (str[s] && is_extra_space(str[s]))
315                 s++;
316
317         e = strlen(str) - 1;
318         while (e > s) {
319                 if (!is_extra_space(str[e])){
320                         break;
321                 }
322
323                 e--;
324         }
325
326         if (e > s){
327                 memmove(str, str + s, e - s + 1);
328         }
329
330         str[e - s + 1] = 0;
331         return str;
332 }
333
334
335 // internal function - copy the value for a parameter agruement into the cmdline_parm arg field
336 static void parm_stuff_args(cmdline_parm *parm, char *cmdline)
337 {
338         char buffer[1024] = { 0 };
339         char *dest = buffer;
340
341         while ((*cmdline != 0) && (*cmdline != '-') && ((size_t)(dest-buffer) < SDL_arraysize(buffer))) {
342                 *dest++ = *cmdline++;
343         }
344
345         drop_extra_chars(buffer);
346
347         // mwa 9/14/98 -- made it so that newer command line arguments found will overwrite
348         // the old arguments
349 //      SDL_assert(parm->args == NULL);
350         if ( parm->args != NULL ) {
351                 delete [] parm->args;
352                 parm->args = NULL;
353         }
354
355         int size = strlen(buffer);
356         if (size > 0) {
357                 parm->args = new (std::nothrow) char[size+1];
358
359                 if (parm->args != NULL) {
360                         memset(parm->args, 0, size+1);
361                         SDL_strlcpy(parm->args, buffer, size+1);
362                 }
363         }
364 }
365
366
367 // internal function - parse the command line, extracting parameter arguements if they exist
368 // cmdline - command line string passed to the application
369 static void os_parse_parms(char *cmdline)
370 {
371         // locate command line parameters
372         cmdline_parm *parmp;
373         char *cmdline_offset = NULL;
374         char pname[33] = { 0 };
375
376         if ( !cmdline || (strlen(cmdline) <= 1) ) {
377                 return;
378         }
379
380         for (parmp = GET_FIRST(&Parm_list); parmp !=END_OF_LIST(&Parm_list); parmp = GET_NEXT(parmp) ) {
381                 // check with space to make sure we get the correct option name
382                 SDL_snprintf(pname, SDL_arraysize(pname), "%s ", parmp->name);
383                 cmdline_offset = strstr(cmdline, pname);
384
385                 if (cmdline_offset) {
386                         cmdline_offset += strlen(parmp->name);
387                 } else if (parmp->name2 != NULL) {
388                         // check with space to make sure we get the correct option name
389                         SDL_snprintf(pname, SDL_arraysize(pname), "%s ", parmp->name2);
390                         cmdline_offset = strstr(cmdline, pname);
391
392                         if (cmdline_offset) {
393                                 cmdline_offset += strlen(parmp->name2);
394                         }
395                 }
396
397                 if (cmdline_offset) {
398                         parmp->name_found = 1;
399                         parm_stuff_args(parmp, cmdline_offset);
400                 }
401         }
402 }
403
404 static bool os_find_parm(const cmdline_parm *parmp, const char *token)
405 {
406         // allow for double '-'
407         if ( (strlen(token) > 2) && (token[1] == '-') ) {
408                 token++;
409         }
410
411         if ( !strcmp(parmp->name, token) ) {
412                 return true;
413         }
414
415         if ( (parmp->name2 != NULL) && !strcmp(parmp->name2, token) ) {
416                 return true;
417         }
418
419         return false;
420 }
421
422 // help for available cmdline options
423 static void print_instructions()
424 {
425         printf("http://icculus.org/freespace2\n");
426         printf("Support - FAQ: http://icculus.org/lgfaq\n");
427         printf("          Web: http://bugzilla.icculus.org\n\n");
428
429 #if defined(FS1_DEMO)
430         printf("Usage: fsdemo [options]\n");
431 #elif defined(FS2_DEMO)
432         printf("Usage: fs2demo [options]\n");
433 #elif defined(MAKE_FS1)
434         printf("Usage: fs [options]\n");
435 #else
436         printf("Usage: fs2 [options]\n");
437 #endif
438         printf("\n");
439         printf("  General:\n");
440         printf("     [-h | --help]           Show this help message\n");
441         printf("     [-v | --version]        Show game version\n");
442         printf("     [-s | --nosound]        Do not access the sound card\n");
443         printf("     [-f | --fullscreen]     Run the game fullscreen\n");
444         printf("     [-w | --window]         Run the game in a window\n");
445         printf("     [-n | --nomovies]       Do not play movies\n");
446         printf("     [-P | --pofspew]        Save model info to pofspew.txt\n");
447         printf("     [-M | --coords]         Show coordinates of the mouse cursor\n");
448         printf("     [--nomusic]             Do not play music\n");
449         printf("\n");
450 #ifndef FS1_DEMO
451         printf("  Multiplayer:\n");
452         printf("     [-d | --standalone]     Run as a dedicated server\n");
453         printf("     [-S | --startgame]      Start a multiplayer game\n");
454         printf("     [-N | --gamename]       Name of the multiplayer game\n");
455         printf("     [-p | --password]       Use this password to connect\n");
456         printf("     [-c | --closed]         Closed multiplayer game\n");
457         printf("     [-r | --restricted]     Restricted multiplayer game\n");
458         printf("     [-a | --allowabove]     Only allow above certain rank\n");
459         printf("     [-b | --allowbelow]     Only allow below certain rank\n");
460         printf("     [-o | --port]           Port to use for multiplayer games\n");
461         printf("     [-C | --connect]        Connect to particular IP address\n");
462         printf("     [-m | --multilog]       Log multiplayer events\n");
463         printf("     [-F | --oldfire]        Server side firing\n");
464         printf("     [-D | --clientdamage]   Client does damage\n");
465         printf("     [-t | --timeout]        Multiplayer game timeout\n");
466         printf("\n");
467 #endif
468
469         printf("%s v%d.%02d", Osreg_title, FS_VERSION_MAJOR, FS_VERSION_MINOR);
470 #ifdef GIT_INFO
471         printf(" ~ %s:%s", GIT_COMMIT_DATE, GIT_COMMIT_HASH);
472 #endif
473         printf("\n");
474
475         exit(0);
476 }
477
478 // validate the command line parameters.  Display an error if an unrecognized parameter is located.
479 static void os_validate_parms(char *cmdline)
480 {
481         cmdline_parm *parmp;
482         char seps[] = " ,\t\n";
483         char *token;
484         int parm_found;
485
486         if ( !cmdline || (strlen(cmdline) <= 1) ) {
487                 return;
488         }
489
490    token = strtok(cmdline, seps);
491    while(token != NULL) {
492                 if (token[0] == '-') {
493                         parm_found = 0;
494                         for (parmp = GET_FIRST(&Parm_list); parmp !=END_OF_LIST(&Parm_list); parmp = GET_NEXT(parmp) ) {
495                                 if ( os_find_parm(parmp, token) ) {
496                                         parm_found = 1;
497                                         break;
498                                 }
499                         }
500
501                         if (parm_found == 0) {
502                                 print_instructions();
503                         }
504                 }
505
506                 token = strtok(NULL, seps);
507         }
508 }
509
510
511 // Call once to initialize the command line system
512 //
513 // cmdline - command line string passed to the application
514 static void os_init_cmdline(const char *cmdline)
515 {
516         FILE *fp = NULL;
517         char cmdname[1024] = { 0 };
518
519         // read the cmdline.cfg file from the data folder, and pass the command line arguments to
520         // the the parse_parms and validate_parms line.  Read these first so anything actually on
521         // the command line will take precedence
522
523         if ( cfile_init_paths() ) {
524                 exit(-2);
525         }
526
527         mprintf(("Command line: "));
528
529         SDL_snprintf(cmdname, SDL_arraysize(cmdname), "%s%s%scmdline.cfg", Cfile_user_dir, Pathtypes[CF_TYPE_DATA].path, DIR_SEPARATOR_STR);
530
531         fp = fopen (cmdname, "rt");
532
533         if ( !fp ) {
534                 // if not already found check exec directory
535                 SDL_snprintf(cmdname, SDL_arraysize(cmdname), "%s%s%scmdline.cfg", Cfile_root_dir, Pathtypes[CF_TYPE_DATA].path, DIR_SEPARATOR_STR);
536
537                 fp = fopen (cmdname, "rt");
538         }
539
540         // if the file exists, get a single line, and deal with it
541         if ( fp ) {
542                 char buf[1024] = { 0 }, *p;
543
544                 while (fgets(buf, SDL_arraysize(buf), fp) != NULL) {
545                         // replace the newline character with a NUL:
546                         if ( (p = strrchr(buf, '\n')) != NULL ) {
547                                 *p = '\0';
548                         }
549
550                         // make sure that we have a trailing space for option finding to
551                         // work properly with single args
552                         SDL_strlcat(buf, " ", SDL_arraysize(buf));
553
554                         mprintf(("%s", buf));
555
556                         os_parse_parms(buf);
557                         os_validate_parms(buf);
558                 }
559
560                 fclose(fp);
561         }
562
563         if ( cmdline && strlen(cmdline) ) {
564                 mprintf(("%s", cmdline));
565
566                 // for proper arg handling make sure cmdline has trailing space
567                 int len = strlen(cmdline) + 2;
568                 char *m_cmdline = (char*) malloc(len);
569
570                 if (m_cmdline) {
571                         SDL_strlcpy(m_cmdline, cmdline, len);
572                         SDL_strlcat(m_cmdline, " ", len);
573
574                         os_parse_parms(m_cmdline);
575                         os_validate_parms(m_cmdline);
576
577                         free(m_cmdline);
578                 }
579         }
580
581         mprintf(("\n"));
582 }
583
584 // arg constructor
585 // name_ - name of the parameter, must start with '-' character
586 // help_ - help text for this parameter
587 cmdline_parm::cmdline_parm(const char *name_, const char *name2_, const char *help_)
588 {
589         name = name_;
590         name2 = name2_;
591         help = help_;
592         args = NULL;
593         name_found = 0;
594
595         if (Parm_list_inited == 0) {
596                 list_init(&Parm_list);
597                 Parm_list_inited = 1;
598         }
599
600         if (name != NULL) {
601                 list_append(&Parm_list, this);
602         }
603 }
604
605
606 // destructor - frees any allocated memory
607 cmdline_parm::~cmdline_parm()
608 {
609         if (args) {
610                 delete [] args;
611                 args = NULL;
612         }
613 }
614
615
616 // returns - true if the parameter exists on the command line, otherwise false
617 int cmdline_parm::found()
618 {
619         return name_found;
620 }
621
622
623 // returns - the interger representation for the parameter arguement
624 int cmdline_parm::get_int()
625 {
626         SDL_assert(args);
627         return atoi(args);
628 }
629
630
631 // returns - the float representation for the parameter arguement
632 float cmdline_parm::get_float()
633 {
634         SDL_assert(args);
635         return (float)atof(args);
636 }
637
638
639 // returns - the string value for the parameter arguement
640 char *cmdline_parm::str()
641 {
642         SDL_assert(args);
643         return args;
644 }
645
646 // external entry point into this modules
647 int parse_cmdline(const char *cmdline)
648 {
649         os_init_cmdline(cmdline);
650
651         if ( std_daemon.found() ) {
652                 // ignored (handled in main() already)
653         }
654
655 #ifndef FS1_DEMO
656         // is this a standalone server??
657         if (standalone_arg.found()) {
658                 Is_standalone = 1;
659         }
660 #endif
661
662         // run with no sound
663         if ( nosound_arg.found() ) {
664                 Cmdline_freespace_no_sound = 1;
665         }
666
667         // run with no music
668         if ( nomusic_arg.found() ) {
669                 Cmdline_freespace_no_music = 1;
670         }
671
672 #ifndef FS1_DEMO
673         // should we start a network game
674         if ( startgame_arg.found() ) {
675                 Cmdline_use_last_pilot = 1;
676                 Cmdline_start_netgame = 1;
677         }
678
679         // closed network game
680         if ( gameclosed_arg.found() ) {
681                 Cmdline_closed_game = 1;
682         }
683
684         // restircted network game
685         if ( gamerestricted_arg.found() ) {
686                 Cmdline_restricted_game = 1;
687         }
688
689         // get the name of the network game
690         if ( gamename_arg.found() ) {
691                 Cmdline_game_name = gamename_arg.str();
692
693                 // be sure that this string fits in our limits
694                 if ( Cmdline_game_name && (strlen(Cmdline_game_name) > MAX_GAMENAME_LEN) ) {
695                         Cmdline_game_name[MAX_GAMENAME_LEN-1] = '\0';
696                 }
697         }
698
699         // get the password for a pssword game
700         if ( gamepassword_arg.found() ) {
701                 Cmdline_game_password = gamepassword_arg.str();
702
703                 // be sure that this string fits in our limits
704                 if ( Cmdline_game_password && (strlen(Cmdline_game_password) > MAX_PASSWD_LEN) ) {
705                         Cmdline_game_password[MAX_PASSWD_LEN-1] = '\0';
706                 }
707         }
708
709         // set the rank above/below arguments
710         if ( allowabove_arg.found() ) {
711                 Cmdline_rank_above = allowabove_arg.str();
712         }
713         if ( allowbelow_arg.found() ) {
714                 Cmdline_rank_below = allowbelow_arg.str();
715         }
716
717         // get the port number for games
718         if ( port_arg.found() ) {
719                 Cmdline_network_port = port_arg.get_int();
720         }
721
722         // the connect argument specifies to join a game at this particular address
723         if ( connect_arg.found() ) {
724                 Cmdline_use_last_pilot = 1;
725                 Cmdline_connect_addr = connect_arg.str();
726         }
727
728         // see if the multilog flag was set
729         if ( multilog_arg.found() ){
730                 Cmdline_multi_log = 1;
731         }       
732
733         // maybe use old-school server-side firing
734         if (server_firing_arg.found() ){
735                 Cmdline_server_firing = 1;
736         }
737
738         // maybe use old-school client damage
739         if(client_dodamage.found()){
740                 Cmdline_client_dodamage = 1;
741         }       
742 #endif
743
744         // spew pof info
745         if(pof_spew.found()){
746                 Cmdline_spew_pof_info = 1;
747         }
748
749         // 32 bit
750         if(d3d_32bit.found()){
751                 Cmdline_force_32bit = 1;
752         }
753
754         // mouse coords
755         if(mouse_coords.found()){
756                 Cmdline_mouse_coords = 1;
757         }
758
759 #ifndef FS1_DEMO
760         // net timeout
761         if(timeout.found()){
762                 Cmdline_timeout = timeout.get_int();
763         }
764 #endif
765
766         // d3d windowed
767         if(d3d_window.found()){
768                 Cmdline_window = 1;
769         }
770
771         // run fullscreen
772         if(d3d_fullscreen.found()){
773                 Cmdline_fullscreen = 1;
774         }
775
776         // help!!
777         if(help.found()){
778                 print_instructions();
779         }
780
781         // play movies?
782         if(no_movies.found()){
783                 Cmdline_play_movies = 0;
784         }
785
786         // display game version
787         if(fs_version.found()){
788                 printf("%s version:  %d.%02d", Osreg_title, FS_VERSION_MAJOR, FS_VERSION_MINOR);
789 #ifdef GIT_INFO
790                 printf(" ~ %s:%s", GIT_COMMIT_DATE, GIT_COMMIT_HASH);
791 #endif
792                 printf("\n");
793                 exit(0);
794         }
795
796 #ifndef NDEBUG
797         // default to windowed mode in debug builds
798         Cmdline_fullscreen = 0;
799         Cmdline_window = 1;
800 #endif
801
802 #ifdef __EMSCRIPTEN__
803         // default to windowed mode and no movies
804         Cmdline_play_movies = 0;
805         Cmdline_fullscreen = 0;
806         Cmdline_window = 1;
807 #endif
808
809         return 1;
810 }