]> granicus.if.org Git - xconq/blobdiff - sdl/sdlunix.cc
commits for 7.5.0 pre-release tarball
[xconq] / sdl / sdlunix.cc
diff --git a/sdl/sdlunix.cc b/sdl/sdlunix.cc
new file mode 100644 (file)
index 0000000..5522707
--- /dev/null
@@ -0,0 +1,185 @@
+/* The main program of the X11 interface to Xconq.
+   Copyright (C) 1987-1989, 1991-2000 Stanley T. Shebs.
+
+Xconq is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.  See the file COPYING.  */
+
+#include "sdlpreconq.h"
+#include "conq.h"
+#include "kpublic.h"
+#include "cmdline.h"
+#include "sdlconq.h"
+
+extern int use_stdio;
+
+int using_sdl;
+
+int blinking_curunit = FALSE;
+
+#include <unistd.h>
+
+/* Local function declarations. */
+
+static void accept_all_remotes(void);
+
+/* The main program. */
+
+int
+main(int argc, char *argv[])
+{
+       extern uid_t games_uid;
+
+       use_stdio = TRUE;
+       /* Dummy reference to get libraries pulled in */
+       if (argc == -1)
+           cmd_error(NULL, NULL);
+       /* Shift to being the user that started the game. */
+       games_uid = geteuid();
+       setuid(getuid());
+       init_library_path(NULL);
+       /* Fiddle with game module structures. */
+       clear_game_modules();
+#ifdef DEBUGGING
+       init_debug_to_stdout();
+#endif /* DEBUGGING */
+       /* Set up empty data structures. */
+       init_data_structures();
+
+       parse_command_line(argc, argv, general_options);
+       parse_command_line(argc, argv, variant_options);
+       parse_command_line(argc, argv, player_options);
+       /* Complain about anything that's left. */
+       parse_command_line(argc, argv, leftover_options);
+
+       if (argc > 1) {
+               /* We're probably typing in a command line, use stdout. */
+               printf("\n              Welcome to X11 Xconq version %s\n\n", version_string());
+               printf("%s", license_string());
+               print_any_news();
+       } else {
+               /* Total GUI-ness this way. */
+               option_popup_new_game_dialog = TRUE;
+       }
+       /* Will be set to TRUE if calling initial_ui_init in sdlmain.c. */
+       using_sdl = FALSE;
+
+       initial_ui_init();
+
+       /* The new game dialog is not supported in sdlconq yet. */
+       if (using_sdl) {
+               option_popup_new_game_dialog = FALSE;
+       }
+       if (option_popup_new_game_dialog) {
+               /* Do all game setup via the GUI. */
+               popup_game_dialog();
+       } else if (option_game_to_join != NULL) {
+               /* Joining a game, using the command line. */
+               /* (should detect attempts to ask for options that will be ignored) */
+               /* (should be able to ask for position among sides) */
+               int rslt = try_join_game(option_game_to_join);
+
+               if (rslt == FALSE) {
+                       fprintf(stderr, "No response from host at \"%s\"\n", option_game_to_join);
+                       exit(1);
+               } else if (rslt == DONE) {
+                       fprintf(stderr, "Cannot join ongoing game at \"%s\"\n", option_game_to_join);
+                       exit(1);
+               }
+               printf("Connected to game host\n");
+               /* Keep talking to the host until the game is all set up. */
+               while (current_stage != game_ready_stage) {
+                       receive_data(0, MAXPACKETS);
+               }
+               launch_game();
+       } else {
+               /* Hosting a game from the command line, or else playing solo. */
+               if (option_game_to_host != NULL) {
+                       /* Collect the programs that will participate in game
+                       setup (more may come later, after the game has
+                       started, if the game module allows it). */
+                       host_the_game(option_game_to_host);
+                       accept_all_remotes();
+               }
+               start_game_load_stage();
+               load_all_modules();
+               check_game_validity();
+               if (my_rid > 0 && my_rid == master_rid) {
+                       broadcast_game_module();
+               }
+               interpret_variants();
+               set_variants_from_options();
+               start_player_pre_setup_stage();
+               set_players_from_options();
+               start_player_setup_stage();
+               launch_game();
+       }
+       if (!option_popup_new_game_dialog)
+           print_instructions();
+       /* At this point we know we can use popups instead of stdio for
+       warnings and messages and such. */
+       use_stdio = FALSE;
+       /* Go into the main play loop. */
+       ui_mainloop();
+
+       /* Humor the compiler. */
+       return 0;
+}
+
+/* The default (human) player is the current user on the current display. */
+
+Player *
+add_default_player(void)
+{
+    Player *player = add_player();
+    
+    player->name = getenv("USER");
+    player->configname = getenv("XCONQCONFIG");
+    player->displayname = getenv("DISPLAY");
+    return player;
+}
+
+void
+make_default_player_spec(void)
+{
+    if (default_player_spec == NULL)
+      default_player_spec = (char *)xmalloc(BUFSIZE);
+    default_player_spec[0] = '\0';
+    if (!empty_string(getenv("USER"))) {
+       strncpy(default_player_spec, getenv("USER"), 
+                                                  BUFSIZE - 2);
+       strcat(default_player_spec, "@");
+    }
+    if (!empty_string(raw_default_player_spec)
+       && raw_default_player_spec[0] == '@') {
+       strncat(default_player_spec, raw_default_player_spec, 
+                                                  BUFSIZE - strlen(default_player_spec) - 1);
+    } else if (!empty_string(getenv("DISPLAY"))) {
+       strncat(default_player_spec, getenv("DISPLAY"), 
+                                                  BUFSIZE - strlen(default_player_spec) - 1);
+    }
+}
+
+/* Wait for all the players to join, set up each one as it comes in. */
+
+static void
+accept_all_remotes(void)
+{
+    int lastcount;
+    extern int option_num_to_wait_for;
+
+    /* (should error?) */
+    if (option_num_to_wait_for <= 0)
+      return;
+    numremotewaiting = option_num_to_wait_for;
+    printf("Now waiting for %d to join\n", numremotewaiting);
+    while (numremotes < (option_num_to_wait_for + 1)) {
+       lastcount = numremotes;
+       receive_data(0, MAXPACKETS);
+       if (numremotes != lastcount) {
+           numremotewaiting = (option_num_to_wait_for - (numremotes - 1));
+           printf("Now waiting for %d to join\n", numremotewaiting);
+       }
+    }
+}