home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume13 / dominion / part27 / dominion.c < prev    next >
C/C++ Source or Header  |  1992-02-11  |  6KB  |  256 lines

  1.   /* dominion.c -- main loop of dominion */
  2.  
  3. /*
  4.  * Copyright (C) 1990 Free Software Foundation, Inc.
  5.  * Written by the dominion project.
  6.  *
  7.  * This file is part of dominion.
  8.  *
  9.  * dominion is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License as published
  11.  * by the Free Software Foundation; either version 1, or (at your option)
  12.  * any later version.
  13.  *
  14.  * This software is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this software; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23.  
  24. #include "dominion.h"
  25. #include "misc.h"
  26. #include <stdio.h>
  27. #include <signal.h>
  28.  
  29.   /* most of these data structures are declared in ext.c */
  30. extern Suser user;
  31. extern Sworld world;
  32. extern struct race_list *races;
  33. extern char libdir[];
  34. extern int euid, ruid;
  35. extern char help_tag[];
  36. extern int interrupt();
  37. extern int (*keymap[128])();
  38. extern char *get_update_time(), *update_time;
  39.  
  40. int old_umask;            /* to reset when we leave */
  41. #ifdef ANDREW
  42. int beroot = 0;
  43. #endif
  44.  
  45. main(argc, argv)
  46. int argc;
  47. char *argv[];
  48. {
  49.   int c;
  50.   int innation = 0;
  51.   char nation[NAMELEN];
  52.   extern char *optarg;
  53.   extern int optind;
  54. #ifdef BSD
  55.     /* BSD uses getwd(), which does not allocate static space */
  56.   extern char current_dir[], *getwd();
  57. #else /* BSD */
  58.   extern char *current_dir, *getcwd();
  59. #endif /* BSD */
  60.     /* starting help tag is Top */
  61.   strcpy(help_tag, "Top");
  62.  
  63.     /* now get some unix system information */
  64.   ruid = getuid();
  65.   euid = geteuid();
  66.   old_umask = umask(077);
  67. /*  printf("ruid = %d, euid = %d\n", ruid, euid); */
  68. #ifdef BSD
  69.   getwd(current_dir);
  70. #else /* BSD */
  71.   current_dir = getcwd(NULL, PATHLEN);
  72. #endif /* BSD */
  73. /*  printf("current dir is %s\n", current_dir); */
  74.   strcpy(libdir, DEF_LIBDIR);
  75.  
  76.   user.xmode = 0;
  77. #ifndef ANDREW
  78.   while ((c = getopt(argc, argv, "n:d:vphc--")) != EOF)
  79. #else
  80.   while ((c = getopt(argc, argv, "n:d:vuphc--")) != EOF)
  81. #endif
  82.     switch (c) {
  83. #ifdef ANDREW
  84.      case 'u':
  85.        beroot = 0;
  86.        break;
  87. #endif
  88.     case 'n':
  89.       innation = 1;
  90.       strcpy(nation, optarg);
  91.       break;
  92.     case 'v':
  93.       /*      viewall = 1; */
  94.       break;
  95.     case 'd':
  96.       strcpy(libdir, optarg);
  97.       break;
  98.     case 'h':
  99.       chdir(libdir);
  100.       init_screen();
  101.       online_info();
  102.       resetty();
  103.       endwin();
  104.       exit(1);
  105.     case 'p':
  106.       chdir(libdir);
  107.       read_races();
  108.       read_world(&world, WORLD_FILE);
  109.       print_nations();
  110.       exit(1);
  111.    case 'c':
  112.       chdir(libdir);
  113.       printf("Last update at %s\n",get_update_time());
  114.       exit(0);
  115.     default:
  116.       usageerr(argc,argv);
  117.       exit(1);
  118.    }
  119. #ifdef ANDREW
  120.   if (beroot == 1) {
  121.     Authenticate();
  122.     beGames();
  123.   }
  124. #endif
  125.   if (chdir(libdir) != 0) {
  126.     fprintf(stderr,"Error: cannot cd to directory %s\n",libdir);
  127.     clean_exit();
  128.     exit();
  129.   }
  130.   update_time = get_update_time();
  131. /*  printf("libdir=%s,def_libdir=%s\n", libdir, DEF_LIBDIR); */
  132.  
  133.   init();            /* set up data structures */
  134.   init_user(innation, nation);
  135.     /* init keymap after user is loaded, because of master commands */
  136.   init_keymap();
  137.   init_screen();
  138.   intro(&world, user.np);
  139.   noncritical();        /* normal signal operation */
  140.   main_loop();
  141.   cleanup();
  142.   clean_exit();
  143.   exit(0);
  144. }
  145.  
  146. init()
  147. {
  148.   printf("Initializing...\r\n");
  149.   SRND(time(0L));        /* initialize random number generator */
  150.   read_races();            /* get races from races file */
  151.     /* read in the world */
  152.   read_world(&world, WORLD_FILE);
  153. }
  154.  
  155.     /* this is where all the work is done  */
  156. main_loop()
  157. {
  158.   char c;
  159.   char s[80];
  160.  
  161.   for ( ; ; ) {
  162.     sprintf(s, "Nation %s; money %d; Thon %d;   type %c for help",
  163.         user.np->name, user.np->money, world.turn, user.help_char);
  164.     statline(s, "draw_map_regular");
  165.     if (user.just_moved) {
  166.       draw_map();
  167.       user.just_moved = 0;
  168.     }
  169.     set_cursor();
  170.     switch(c = getch()) {
  171.     default:
  172.       (*keymap[c % 128])();    /* make sure no high bits get there */
  173.       (void) re_center(user.cursor.x, user.cursor.y); /* ignore return val */
  174.       if (user.just_moved) {
  175.     wrap(&user.cursor);
  176.     if (!army_is_in_sector(&world.map[user.cursor.x][user.cursor.y],
  177.                    user.id, user.current_army)) {
  178.       user.current_army
  179.         = first_sect_army(&world.map[user.cursor.x][user.cursor.y]);
  180.     }
  181.       }
  182.       break;
  183.     }
  184.   }
  185. }
  186.  
  187.   /* clean up graphics, and flush out the exec file */
  188. cleanup()
  189. {
  190.   int i;
  191.  
  192.   statline("", "cleanup");
  193. /*  delay_output(200); */
  194.   resetty();
  195.   endwin();
  196.   putchar('\n');
  197.   putchar('\n');
  198.   gen_exec(NULL);
  199. }
  200.  
  201. clean_exit()
  202. {
  203.   extern int is_in_diplo;
  204.  
  205.   if (is_in_diplo) {
  206.     unlink("DIPLOCK");
  207.   }
  208.   del_lock(user.id);
  209.   umask(old_umask);
  210. #ifdef ANDREW
  211.   if (beroot == 1) {
  212.     bePlayer();
  213.     unAuth();
  214.     beroot = 0;
  215.   }
  216. #endif
  217. }
  218.  
  219. critical()            /* while writing data files, don't bug me!! */
  220. {
  221.   signal(SIGINT, SIG_IGN);
  222.   signal(SIGQUIT, SIG_IGN);
  223. #ifdef SIGTSTP
  224.   signal(SIGTSTP, SIG_IGN);
  225. #endif /* SIGTSTP */
  226.   signal(SIGHUP, SIG_IGN);
  227. }
  228.  
  229. noncritical()            /* normal operation */
  230. {
  231.   signal(SIGINT, interrupt);
  232.   signal(SIGQUIT, interrupt);
  233. #ifdef SIGTSTP
  234.   signal(SIGTSTP, interrupt);
  235. #endif /* SIGTSTP */
  236.   signal(SIGHUP, interrupt);
  237. }
  238.  
  239.   /* just prints a list of all nations to the terminal */
  240. print_nations()
  241. {
  242.   int i;
  243.   Snation *np;
  244.  
  245.   printf("%s %-14s[%s]    %-15s %-10s\n", "Id", "Name",
  246.      "mark", "Leader", "Race");
  247.   printf("----------------------------------------------------------------------\n");
  248.   for (i = 1; i < world.n_nations; ++i) {
  249.     np = &world.nations[i];
  250.     printf("%2d %-15s [%c]     %-15s %-10s %-10s %-5s\n", i, np->name,np->mark,
  251.        np->leader, np->race.name, is_active_ntn(np) ? "" : "DESTROYED",
  252.        np->npc_flag ? "npc" : "");
  253.   }
  254. }
  255.  
  256.