home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume9 / wanderer3 / part02 / m.c < prev    next >
C/C++ Source or Header  |  1990-05-21  |  5KB  |  251 lines

  1. #include "wand_head.h"
  2. #include <sys/time.h>
  3.  
  4. extern char *playscreen();
  5.  
  6. extern int rscreen();
  7.  
  8. extern int savescore();
  9.  
  10. extern void map();
  11.  
  12. extern void check_legality();
  13.  
  14. int debug_disp = 0;
  15. int no_passwords = 0;
  16. int maxscreens;
  17. char screen[NOOFROWS][ROWLEN+1];
  18. int edit_mode = 0;
  19. int saved_game = 0;
  20. char *edit_screen = (char *) 0;
  21. char *edit_memory = (char *) 0;
  22. char *memory_end = (char *) 0;
  23. char screen_name[61] ;
  24. int record_file = -1;
  25.  
  26. int readline(fd,ptr,max)
  27. int fd,max;
  28. char *ptr;
  29. {
  30.   int count=0;
  31.   while(read(fd,ptr,1)==1) {
  32.     if(++count==max)
  33.       break;
  34.     if(*ptr=='\n')
  35.       break;
  36.     ptr++;
  37.   }
  38.   *ptr='\0';
  39.   return count;
  40. }
  41.  
  42. show_credits(opt)
  43. int opt;
  44. {
  45. int maxlines, linecount;
  46. FILE *fp;
  47. char ch, buffer[100];
  48. int inp ,nul;
  49. struct timeval tv;
  50.  
  51.     sprintf(buffer,"%s/credits",SCREENPATH);
  52.     if((fp = fopen(buffer,"r")) == NULL) {
  53.         printf("Sorry - credits unavailable!\n");
  54.         exit(1);
  55.     }
  56.     initscr();
  57.     CBON;
  58.     noecho();
  59.     maxlines = tgetnum("li") - 3;
  60.     linecount = 0;
  61.     nul = 0;
  62.     tv.tv_sec = 0;
  63.     tv.tv_usec = 500000L;  /* half second between scrolls */
  64.     while( fgets(buffer,100,fp) ) {
  65.             addstr(buffer);
  66.             if(! opt) {
  67.         if(++linecount == maxlines) {
  68.             move(maxlines + 2,0);
  69.             addstr("-- More --");
  70.             refresh();
  71.             ch = getch();
  72.             if( ch == 'q' ) break;
  73.             move(maxlines + 2,0);
  74.             addstr("          ");
  75.             refresh();
  76.             clear();
  77.             linecount = 0;
  78.         }
  79.         } else {
  80.         inp = 1;
  81.         printf("%s",buffer);
  82.         select(1,&inp,&nul,&nul,&tv);
  83.         if(inp) {
  84.             read(0,&ch,1);
  85.             if(ch == 'q') break;
  86.         }
  87.         }
  88.     }
  89.     CBOFF;
  90.     echo();
  91.     if( ! opt ) {
  92.         move(maxlines+2,0);
  93.         refresh();
  94.     }
  95.     endwin();
  96. }
  97.  
  98. extern int optind,opterr;
  99. extern char *optarg;
  100.  
  101. main(argc,argv)
  102. int  argc;
  103. char **argv;
  104. {
  105. char (*frow)[ROWLEN+1] = screen;
  106. long score = 0;
  107. int fp,num = 1,bell = 0,maxmoves = 0,x,y;
  108. char howdead[25],buffer[100],
  109.      *name,*keys,*dead,ch;
  110. char c,*malloc();
  111.  
  112. keys = (char *) 0;
  113. while(( c = getopt(argc,argv,"01k:et:r:fmCcvs")) != -1 )
  114.     switch(c) {
  115.     case '0': bell = 0; break;
  116.     case '1': bell = 1; break;
  117.     case 'k': keys = optarg; break;
  118.     case 'm': erase_scores();
  119.         exit(0);
  120.     case 'c': show_credits(0);
  121.         exit(0);
  122.     case 'C': show_credits(1);
  123.         exit(0);
  124.     case 's': savescore("-",-1,-1,"-");
  125.         exit(0);
  126.     case 'f': debug_disp = 1; break;
  127.     case 'v': printf("\nWANDERER Copyright (C) 1988 S Shipway. Version %s.\n\n",VERSION);
  128.         exit (0);
  129.     case 'r':
  130.         if((record_file = open(optarg,O_WRONLY|O_CREAT,0600))==-1) {
  131.                 printf("Cannot open file %s for recording.\n",optarg);
  132.             exit(-1);
  133.         break;
  134.     case 'e': edit_mode = 1;
  135.          no_passwords = 1;
  136.             memory_end = edit_memory = malloc(EMSIZE * sizeof(char));
  137.         break;
  138.     case 't': edit_screen = optarg;
  139.         debug_disp = edit_mode = 1;
  140.         rscreen(0,&maxmoves);
  141.         initscr();
  142.         map(frow);
  143.         check_legality();
  144.         move(21,0); refresh();
  145.         endwin();
  146.         exit(0);
  147.     default: fprintf(stderr,"Usage: %s [ -e | -m | -C | -c | -s | [ -r file ] [ -f ] | -t file ] [ -0 | -1 ] [ -k keys ] [ file ]\n",argv[0]);
  148.         exit(1);
  149.     }
  150.     }
  151.  
  152. if( optind < argc ) edit_screen = argv[optind];
  153.  
  154. /* check for passwords - if file no_pws is in screen dir no pws! */
  155. sprintf(buffer,"%s/no_pws",SCREENPATH);
  156. if((fp = open(buffer,O_RDONLY)) != -1) {
  157.     close(fp);
  158.     no_passwords = 1;
  159. }
  160.  
  161. /* count available screens */
  162. for(maxscreens = 0;;maxscreens++) {
  163.     sprintf(buffer,"%s/screen.%d",SCREENPATH,(maxscreens+1));
  164.     if((fp = open(buffer, O_RDONLY)) == -1 )
  165.     break;
  166.     close(fp);
  167. }
  168.  
  169. if((name = (char *)getenv("NEWNAME")) == NULL)
  170.     if((name = (char *)getenv("NAME")) == NULL)
  171.         if((name = (char *)getenv("FULLNAME")) == NULL)
  172.             if((name = (char *)getenv("USER")) == NULL)
  173.         if((name = (char *)getenv("LOGNAME")) == NULL)
  174. #ifdef    ASKNAME    /* M001 */
  175.         {
  176.             name = malloc(80);
  177.             if (name == NULL) {
  178.             printf("malloc error\n");
  179.             exit(1);
  180.             }
  181.             printf("Name? "); fflush(stdout);
  182.             gets(name);
  183.             if (name[0] == '\0')
  184.                 name = "noname";
  185.         }
  186. #else
  187.                 name = "noname";
  188. #endif
  189.  
  190. if( ! keys ) {
  191.     if((keys = (char *)getenv("NEWKEYS")) == NULL)
  192.         {
  193.         keys = malloc(5);
  194.        strcpy(keys,"kjhl");
  195.         }
  196. }
  197.  
  198. initscr();
  199.  
  200. /* MAIN PROGRAM HERE */
  201.  
  202. CBON; noecho();
  203.  
  204. if(!edit_mode) {
  205.     for (;;) {
  206.         if (rscreen(num,&maxmoves)) {
  207.         strcpy(howdead,"a non-existant screen");
  208.         break;
  209.         };
  210.         dead = playscreen(&num,&score,&bell,maxmoves,keys);
  211.         if ((dead != NULL) && (*dead == '~')) {
  212.         num = (int)(dead[1]) - 1;
  213.         dead = NULL;
  214.         }
  215.         if (dead != NULL)
  216.         {
  217.         strcpy(howdead,dead);
  218.             break;
  219.             }
  220.         num++;
  221.         };
  222.  
  223.     printf("\n\n%s killed by %s with a score of %d on level %d.\n",name,howdead,score,num);
  224.     }
  225. else
  226.     {
  227.     if(rscreen(num,&maxmoves))
  228.     {
  229.     for(x=0;x<ROWLEN;x++)
  230.         for(y=0;y<NOOFROWS;y++)
  231.         screen[y][x] =  ' ';
  232.     }
  233.     editscreen(num,&score,&bell,maxmoves,keys);
  234.     }
  235. /* END OF MAIN PROGRAM */
  236.  
  237. /* SAVE ROUTINES FOR SCORES */
  238.  
  239. if(!edit_mode)
  240.     {
  241.     if((savescore(howdead,score,num,name) == 0)&&(score != 0))
  242.          printf("\nWARNING: %s : score not saved!\n",argv[0]);
  243.     }
  244.  
  245. echo();
  246. CBOFF;
  247. endwin();
  248. printf("WANDERER (C)1988 S. Shipway\n");
  249. if(record_file != -1) close(record_file);
  250. }
  251.