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

  1. #include "wand_head.h"
  2. #include <errno.h>
  3.  
  4. /*
  5.     This program converts V2.* save files into V3.* save files.
  6.  
  7.     It can do this for compressed/ uncompressed files, and defaults
  8.     to the def in wand_head.h
  9.  
  10.     Usage:
  11.  
  12.         convert [ -v ] [ -C | -N ] [ -c | -n ] oldfile newfile
  13.  
  14.     -v:  verbose
  15.     -C etc : force encryption / no encryption on OLDFILE or newfile.
  16.  
  17. */
  18.  
  19. char screen[NOOFROWS][ROWLEN+1];
  20. char screen_name[ROWLEN+1];
  21. char *infile, *outfile;
  22.  
  23. struct    saved_game    {
  24.     short    num;
  25.     long    score;
  26.     short    bell;
  27.     short    maxmoves;
  28.     short    num_monsters;
  29. };
  30.  
  31. struct    save_vars    zz;
  32. struct  old_save_vars   yy;
  33.  
  34. int num, bell, maxmoves;
  35. long score;
  36. struct    mon_rec    *last_of_list, *start_of_list, *tail_of_list;
  37.  
  38. int o_enc, n_enc;
  39. int verbose;
  40.  
  41. crypt_file(name)
  42. char *name;
  43. {
  44. char buffer[1024];
  45. int fd,length,loop;
  46.  
  47. if((fd = open(name,O_RDONLY)) == -1) {
  48.     sprintf(buffer,"Wanderer: cannot open %s",name);
  49.     perror(buffer);
  50.     exit(1);
  51. }
  52. if((length = read(fd,buffer,1024)) < 1) {
  53.     sprintf(buffer,"Wanderer: read error on %s",name);
  54.     perror(buffer);
  55.     exit(1);
  56. }
  57. close(fd);
  58.  
  59. /* Right, got it in here, now to encrypt the stuff */
  60.  
  61. srand(BLURFL);
  62. for(loop=0;loop<length;loop++)
  63.     buffer[loop]^=rand();
  64.  
  65. if((fd = open(name,O_WRONLY|O_TRUNC))== -1) {
  66.     sprintf(buffer,"Wanderer: cannot write to %s",name);
  67.     perror(buffer);
  68.     exit(1);
  69. }
  70. if(write(fd,buffer,length)!=length) {
  71.     sprintf(buffer,"Wanderer: write error on %s",name);
  72.     perror(buffer);
  73.     exit(1);
  74. }
  75. close(fd);
  76.  
  77. /* ok, file now contains encrypted/decrypted game. */
  78. /* lets go back home... */
  79. }
  80.  
  81. struct mon_rec *make_monster(x,y)
  82. int x,y;
  83. {
  84. char *malloc();
  85. #define MALLOC (struct mon_rec *)malloc(sizeof(struct mon_rec))
  86. struct mon_rec *monster;
  87. if(tail_of_list->next == NULL)
  88.     {
  89.     if((last_of_list = MALLOC) == NULL)
  90.     return NULL;
  91.     tail_of_list->next = last_of_list;
  92.     last_of_list->prev = tail_of_list;
  93.     last_of_list->next = NULL;
  94.     }
  95. monster = tail_of_list = tail_of_list->next;
  96. monster->x = x;
  97. monster->y = y;
  98. monster->mx = 1;      /* always start moving RIGHT. (fix later)  */
  99. monster->my = 0;
  100. monster->under = ' ';
  101. return monster;
  102. }
  103.  
  104. void save_game()
  105. {
  106.     char    fname[128], buf[70], *fp;
  107.     FILE    *fo;
  108.     struct    saved_game    s;
  109.     extern    char    *getenv();
  110.     struct    mon_rec    *mp;
  111.  
  112.     fp = outfile;
  113.  
  114.     if ((FILE *)NULL == (fo = fopen(outfile, W_BIN))) {
  115.         perror(fp);
  116.         exit(1);
  117.     }
  118.  
  119.     s.num = num;
  120.     s.score = score;
  121.     s.bell = bell;
  122.     s.maxmoves = maxmoves;
  123.     s.num_monsters = 0;
  124.  
  125.     mp = start_of_list;        /* first entry is dummy    */
  126.     while (mp != tail_of_list) {
  127.         mp = mp->next;
  128.         s.num_monsters++;    /* count them monsters    */
  129.     }
  130.  
  131.     if ( (1 != fwrite((char *)&s, sizeof(s), 1, fo)) ||
  132.          (1 != fwrite((char *)screen, sizeof(screen), 1, fo)) ||
  133.          (1 != fwrite((char *)&zz, sizeof(zz), 1, fo)) )
  134.     {
  135.         printf("Write error on '%s'\n", fname);
  136.         fclose(fo);
  137.         unlink(fname);
  138.         exit(1);
  139.     }
  140.  
  141.     mp = start_of_list;
  142.     while (mp != tail_of_list) {
  143.         /* save them monsters    */
  144.         mp = mp->next;
  145.         if (1 != fwrite((char *)mp, sizeof(struct mon_rec), 1, fo)) {
  146.             printf("Write error on '%s'\n", fname);
  147.             fclose(fo);
  148.             unlink(fname);
  149.             exit(1);
  150.         }
  151.     }
  152.     fwrite(screen_name,sizeof(char),strlen(screen_name),fo);
  153.     fclose(fo);
  154.     if( n_enc )
  155.         crypt_file(outfile,0);   /* encrpyt the saved game */
  156.     printf("Game saved.\n\nWanderer Copyright (C) 1988 S Shipway\n\n");
  157. }
  158.  
  159. void restore_game()
  160. {
  161.     FILE    *fi;
  162.     struct    saved_game    s;
  163.     struct    mon_rec    *mp, *tmp, tmp_monst;
  164.     char    fname[128], *fp;
  165.     FILE    *fo;
  166.     extern    char    *getenv();
  167.  
  168.     fp = infile;
  169.  
  170.     if( o_enc )
  171.          crypt_file(infile,1);   /* decrypt it */
  172.     if ((FILE *)NULL == (fi = fopen(infile, R_BIN))) {
  173.         printf("Open error on '%s'\n", fp);
  174.         printf("Cannot restore game --- sorry.\n");
  175.         exit(1);
  176.     }
  177.     if ( (1 != fread((char *)&s, sizeof(s), 1, fi)) ||
  178.          (1 != fread((char *)screen, sizeof(screen), 1, fi)) ||
  179.          (1 != fread((char *)&yy, sizeof(yy), 1, fi)) ) {
  180.         printf("Read error on '%s'\n", fp);
  181.         printf("Cannot restore game --- sorry.\n");
  182.         fclose(fi);
  183.         exit(1);
  184.     }
  185.  
  186.     num = s.num;
  187.     score = s.score;
  188.     bell = s.bell;
  189.     maxmoves = s.maxmoves;
  190.  
  191.     /* free any monsters already on chain, to start clean */
  192.     mp = start_of_list->next;
  193.     while ((mp != NULL) && (mp != start_of_list)) {
  194.         /* free them monsters    */
  195.         tmp = mp;
  196.         mp = mp->next;
  197.         free(tmp);
  198.     }
  199.  
  200.     /* re-initialize the monster list    */
  201.     /* *start_of_list = {0,0,0,0,0,NULL,NULL}; */
  202.     start_of_list->x = 0;
  203.     start_of_list->y = 0;
  204.     start_of_list->mx = 0;
  205.     start_of_list->my = 0;
  206.     start_of_list->under = 0;
  207.     start_of_list->next = (struct mon_rec *)NULL;
  208.     start_of_list->prev = (struct mon_rec *)NULL;
  209.  
  210.     tail_of_list = start_of_list;
  211.  
  212.     while (s.num_monsters--) {
  213.         /* use make_monster to allocate the monster structures    */
  214.         /* to get all the linking right without even trying    */
  215.         if ((struct mon_rec *)NULL == (mp = make_monster(0, 0))) {
  216.             printf("Monster alloc error on '%s'\n", fp);
  217.                         printf("Try again - it might work.\nBut then,pigs might fly...\n");
  218.             fclose(fi);
  219.             exit(1);
  220.         }
  221.         if (1 != fread((char *)&tmp_monst, sizeof(struct mon_rec), 1, fi)) {
  222.             printf("Monster read error on '%s'\n", fp);
  223.             printf("Cannot restore game --- sorry.\n");
  224.             fclose(fi);
  225.             exit(1);
  226.         }
  227.         /* copy info without trashing links    */
  228.         mp->x     = tmp_monst.x;
  229.         mp->y     = tmp_monst.y;
  230.         mp->mx    = tmp_monst.mx;
  231.         mp->my    = tmp_monst.my;
  232.         mp->under = tmp_monst.under;
  233.     }
  234.     fclose(fi);
  235. }
  236.  
  237. extern int opterr,optind;
  238. extern char *optarg;
  239.  
  240. main(argc,argv)
  241. int argc;
  242. char **argv;
  243. {
  244. char c;
  245. struct mon_rec mlist;
  246.  
  247. start_of_list = &mlist;
  248.  
  249. verbose = 0;
  250. #ifdef NO_ENCRYPTION
  251. o_enc = n_enc = 0;
  252. #else
  253. o_enc = n_enc = 1;
  254. #endif
  255.  
  256. while( ( c = getopt(argc,argv,"CNcnv") ) != -1 )
  257.     switch ( c ) {
  258.     case 'C': o_enc = 1; break;
  259.     case 'c': n_enc = 1; break;
  260.     case 'N': o_enc = 0; break;
  261.     case 'n': n_enc = 0; break;
  262.         case 'v': verbose = 1; break;
  263.     default : printf("Usage: %s [ -v ] [ -C | -c ] [ -N | -n ] oldfile newfile\n",argv[0]);
  264.         printf("-v : verbose\n");
  265.         printf("-C : file is encrypted\n -N : file not encrypted\n");
  266.         printf("Upper case -- old file, lower case -- new file\n");
  267.         exit(1);
  268.     }
  269.  
  270. if( (argc - optind) < 2 ) {
  271.     printf("Usage: %s [ -v ] [ -C | -c ] [ -N | -n ] oldfile newfile\n",argv[0]);
  272.     printf("-v : verbose\n");
  273.     printf("-C : file is encrypted\n -N : file not encrypted\n");
  274.     printf("Upper case -- old file, lower case -- new file\n");
  275.     exit(1);
  276. }
  277.  
  278.  
  279. infile = argv[optind++]; outfile = argv[optind];
  280. if(verbose) printf("Converting %s to %s.\n",infile,outfile);
  281.  
  282. if(verbose ) {
  283.     printf( "Reading in file %s. ", infile);
  284.     if( o_enc ) printf("(encrypted)");
  285.     printf("\n");
  286. }
  287.  
  288. restore_game();
  289.  
  290. if( verbose ) printf("Giving screen name.\n");
  291.  
  292. sprintf(screen_name,"------ Wanderer version %s ------",VERSION);
  293.  
  294. if( verbose ) printf(" Copying struct variables... \n");
  295.  
  296. zz.z_x = yy.z_x;
  297. zz.z_y = yy.z_y;
  298. zz.z_tx = yy.z_tx;
  299. zz.z_ty = yy.z_ty;
  300. zz.z_mx = yy.z_mx;
  301. zz.z_my = yy.z_my;
  302. zz.z_sx = yy.z_sx;
  303. zz.z_sy = yy.z_sy;
  304. zz.z_diamonds = yy.z_diamonds;
  305. zz.z_nf = yy.z_nf;
  306.  
  307. if(verbose ) {
  308.     printf( "Saving to file %s. ", outfile);
  309.     if( n_enc ) printf("(encrypted)");
  310.     printf("\n");
  311. }
  312.  
  313. save_game();
  314.  
  315. printf("Done.\n");
  316. }
  317.