305 |
305 |
306 int ttd_main(int argc, char* argv[]) |
306 int ttd_main(int argc, char* argv[]) |
307 { |
307 { |
308 MyGetOptData mgo; |
308 MyGetOptData mgo; |
309 int i; |
309 int i; |
310 bool network = false; |
|
311 char *network_conn = NULL; |
|
312 const char *optformat; |
310 const char *optformat; |
313 char musicdriver[16], sounddriver[16], videodriver[16]; |
311 char musicdriver[16], sounddriver[16], videodriver[16]; |
314 int resolution[2] = {0,0}; |
312 int resolution[2] = {0,0}; |
315 uint startdate = -1; |
313 uint startdate = -1; |
316 bool dedicated; |
314 |
|
315 bool dedicated = false; |
|
316 bool network = false; |
|
317 char *network_conn = NULL; |
317 |
318 |
318 musicdriver[0] = sounddriver[0] = videodriver[0] = 0; |
319 musicdriver[0] = sounddriver[0] = videodriver[0] = 0; |
319 |
320 |
320 _game_mode = GM_MENU; |
321 _game_mode = GM_MENU; |
321 _switch_mode = SM_MENU; |
322 _switch_mode = SM_MENU; |
322 _switch_mode_errorstr = INVALID_STRING_ID; |
323 _switch_mode_errorstr = INVALID_STRING_ID; |
323 _dedicated_forks = false; |
324 _dedicated_forks = false; |
324 dedicated = false; |
|
325 _config_file = NULL; |
325 _config_file = NULL; |
326 |
326 |
327 // The last param of the following function means this: |
327 // The last param of the following function means this: |
328 // a letter means: it accepts that param (e.g.: -h) |
328 // a letter means: it accepts that param (e.g.: -h) |
329 // a ':' behind it means: it need a param (e.g.: -m<driver>) |
329 // a ':' behind it means: it need a param (e.g.: -m<driver>) |
338 while ((i = MyGetOpt(&mgo)) != -1) { |
338 while ((i = MyGetOpt(&mgo)) != -1) { |
339 switch (i) { |
339 switch (i) { |
340 case 'm': ttd_strlcpy(musicdriver, mgo.opt, sizeof(musicdriver)); break; |
340 case 'm': ttd_strlcpy(musicdriver, mgo.opt, sizeof(musicdriver)); break; |
341 case 's': ttd_strlcpy(sounddriver, mgo.opt, sizeof(sounddriver)); break; |
341 case 's': ttd_strlcpy(sounddriver, mgo.opt, sizeof(sounddriver)); break; |
342 case 'v': ttd_strlcpy(videodriver, mgo.opt, sizeof(videodriver)); break; |
342 case 'v': ttd_strlcpy(videodriver, mgo.opt, sizeof(videodriver)); break; |
343 case 'D': { |
343 case 'D': |
344 strcpy(musicdriver, "null"); |
344 strcpy(musicdriver, "null"); |
345 strcpy(sounddriver, "null"); |
345 strcpy(sounddriver, "null"); |
346 strcpy(videodriver, "dedicated"); |
346 strcpy(videodriver, "dedicated"); |
347 dedicated = true; |
347 dedicated = true; |
348 } break; |
348 break; |
349 case 'f': { |
349 case 'f': _dedicated_forks = true; break; |
350 _dedicated_forks = true; |
350 case 'n': |
351 }; break; |
351 network = true; |
352 case 'n': { |
352 network_conn = mgo_opt; // optional IP parameter, NULL if unset |
353 network = true; |
353 break; |
354 if (mgo.opt) |
|
355 // Optional, you can give an IP |
|
356 network_conn = mgo.opt; |
|
357 else |
|
358 network_conn = NULL; |
|
359 } break; |
|
360 case 'b': _ai.network_client = true; break; |
354 case 'b': _ai.network_client = true; break; |
361 case 'r': ParseResolution(resolution, mgo.opt); break; |
355 case 'r': ParseResolution(resolution, mgo.opt); break; |
362 case 't': startdate = atoi(mgo.opt); break; |
356 case 't': startdate = atoi(mgo.opt); break; |
363 case 'd': { |
357 case 'd': { |
364 #if defined(WIN32) |
358 #if defined(WIN32) |
373 strcpy(_file_to_saveload.name, mgo.opt); |
367 strcpy(_file_to_saveload.name, mgo.opt); |
374 _switch_mode = SM_LOAD; |
368 _switch_mode = SM_LOAD; |
375 } else |
369 } else |
376 _switch_mode = SM_NEWGAME; |
370 _switch_mode = SM_NEWGAME; |
377 break; |
371 break; |
378 case 'G': |
372 case 'G': _random_seeds[0][0] = atoi(mgo.opt); break; |
379 _random_seeds[0][0] = atoi(mgo.opt); |
373 case 'c': _config_file = strdup(mgo.opt); break; |
380 break; |
|
381 case 'c': |
|
382 _config_file = strdup(mgo.opt); |
|
383 break; |
|
384 case -2: |
374 case -2: |
385 case 'h': |
375 case 'h': |
386 showhelp(); |
376 showhelp(); |
387 return 0; |
377 return 0; |
388 } |
378 } |
389 } |
379 } |
390 |
380 |
391 if (_ai.network_client && !network) { |
381 if (_ai.network_client && !network) { |
392 _ai.network_client = false; |
382 _ai.network_client = false; |
393 DEBUG(ai, 0)("[AI] Can't enable network-AI, because '-n' is not used\n"); |
383 DEBUG(ai, 0) ("[AI] Can't enable network-AI, because '-n' is not used\n"); |
394 } |
384 } |
395 |
385 |
396 DeterminePaths(); |
386 DeterminePaths(); |
397 CheckExternalFiles(); |
387 CheckExternalFiles(); |
398 |
388 |
439 InitWindowSystem(); |
429 InitWindowSystem(); |
440 |
430 |
441 GfxLoadSprites(); |
431 GfxLoadSprites(); |
442 LoadStringWidthTable(); |
432 LoadStringWidthTable(); |
443 |
433 |
444 DEBUG(misc, 1) ("Loading drivers..."); |
434 DEBUG(driver, 1) ("Loading drivers..."); |
445 LoadDriver(SOUND_DRIVER, _ini_sounddriver); |
435 LoadDriver(SOUND_DRIVER, _ini_sounddriver); |
446 LoadDriver(MUSIC_DRIVER, _ini_musicdriver); |
436 LoadDriver(MUSIC_DRIVER, _ini_musicdriver); |
447 LoadDriver(VIDEO_DRIVER, _ini_videodriver); // load video last, to prevent an empty window while sound and music loads |
437 LoadDriver(VIDEO_DRIVER, _ini_videodriver); // load video last, to prevent an empty window while sound and music loads |
448 _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING; |
438 _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING; |
449 |
439 |