home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume8 / castle / part04 / files.c next >
Text File  |  1990-02-23  |  16KB  |  679 lines

  1. # include <stdio.h>
  2. # include <sys/types.h>
  3. # include <sys/stat.h>
  4. # include <fcntl.h>
  5. # include <sys/time.h>                 /* include for the time routines    */
  6. # include <curses.h>            /* include screen routines          */
  7.  
  8. # include "INCLUDE/items.h"
  9. # include "INCLUDE/castle.h"
  10.  
  11. # define  LF    '\012'
  12. /*
  13. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  14. +                                                                         +
  15. + Included are The file routines:                                         +
  16. +                                                                         +
  17. + get_levels()    Coordinates read of the dungeon levels.                 +
  18. + read_level()    Reads the individual levels.                            +
  19. + help_me()       Reads the help file and displays it on the screen.      +
  20. + game_stat()     Reads the hours file and determines if the game         +
  21. +                 is open depending on the time.                          +
  22. + dis_open_scr()  Displays the opening credits screen.                    +
  23. + score_list()    Coordinates the score file routines.                    +
  24. + write_it()      Writes updated information to the score file.           +
  25. + read_it()       Reads the old information from the score file.          +
  26. + configure()     Configures the information that is to be written        +
  27. +                 to the score file, (Puts your name in the proper        +
  28. +                 place in the score list).                               +
  29. + print_scores()  Prints the scores if you just died or quit, after       +
  30. +                 a game run.                                             +
  31. + prn_scores()    Prints score list if -s option is given at command line.+
  32. +                                                                         +
  33. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  34. */
  35.  
  36. /*
  37.  
  38.     This is a public domain program, I have no objection to modifications
  39. made on it or use for some other reason so long as this notice remains intact.
  40.  
  41.     
  42.         Part of:  castle     Ted Wisniewski
  43.         Author:            Plymouth State College
  44.                     Plymouth NH,
  45.                             03264
  46.         Copyright() PSC
  47. */
  48.  
  49. char files[20];
  50. char f_nam[80];
  51.  
  52. get_levels()
  53. {
  54.     int lvl = 1;
  55.  
  56.     strcpy(files,D_LVL_1);
  57.     read_level(lvl);
  58.     lvl++;
  59.     strcpy(files,D_LVL_2);
  60.     read_level(lvl);
  61.     lvl++;
  62.     strcpy(files,D_LVL_3);
  63.     read_level(lvl);    
  64.     lvl++;
  65.     strcpy(files,D_LVL_4);
  66.     read_level(lvl);
  67.     lvl++;
  68.     strcpy(files,D_LVL_5);
  69.     read_level(lvl);
  70.     lvl++;
  71.     strcpy(files,D_LVL_6);
  72.     read_level(lvl);
  73.  
  74. }
  75.  
  76. read_level(lvl)
  77. int lvl;
  78. {
  79.     char buffer[2048];
  80.     int filedes,numread,row,col,count;
  81.  
  82.     filedes = open(files,O_RDONLY);
  83.     numread = read(filedes,buffer,2048);
  84.     close(filedes);
  85.  
  86.     count = 0;
  87.     for(row=0;row<=23;row++){
  88.         for(col=0;col<=75;col++){
  89.             levels[lvl][row][col] = buffer[count];
  90.             count++;
  91.         }
  92.     }
  93. }
  94.  
  95.  
  96. help_me()
  97. {
  98.     int fd,nread;
  99.     int ctr,lines = 0;
  100.     char text[8192];
  101.  
  102.     sprintf(f_nam,"%s",HELP);
  103.     fd = open(f_nam, O_RDONLY);
  104.     nread = read(fd,text,8192);
  105.     close(fd);
  106.     savetty();
  107.     initscr();
  108.     clear();
  109.     for(ctr=0;ctr<nread;ctr++){
  110.         if(text[ctr] == LF){
  111.             lines++;
  112.             if((lines % 21) == 0){
  113.                 printw("\n\nPress a key to continue.");
  114.                 refresh();
  115.                 getch();
  116.                 clear();
  117.                 move(0,0);
  118.             }
  119.         }
  120.         printw("%c",text[ctr]);
  121.         refresh();
  122.     }
  123.     resetty();
  124.     exit(0);
  125. }
  126.  
  127.  
  128.  
  129. game_stat()
  130. {
  131.     int row = 1;
  132.     int col = 1;
  133.     int hour,day,i;
  134.     int filedes,numread;
  135.     long t_ptr;            /* Make time pointer a long int  */
  136.     char matrix[24][80];
  137.     char buffer[2048];
  138.     struct tm *local, *localtime(); /* Give variables tm structure   */
  139.  
  140.     time(&t_ptr);                 /* Get the time from the system  */
  141.  
  142.     local = localtime(&t_ptr);      /* Get tm struct for the time    */
  143.  
  144.     hour = local->tm_hour;        /* set variable to local->tm_hour*/
  145.     day  = local->tm_wday;          /* set variable to local->tm_wday*/
  146.  
  147.     (void) strcpy(f_nam,HOURS);
  148.     if((filedes = open(f_nam,O_RDONLY)) < 0){
  149.         printf("Aborted Due to No Hours File <%s>.\n", f_nam);
  150.         exit(1);
  151.     }
  152.  
  153.     numread = read(filedes,buffer,2048);
  154.     close(filedes);
  155.  
  156.  
  157.     for(i=0;i<=numread;i++){
  158.         if(buffer[i] == 10 || buffer[i] == 13){
  159.             matrix[row][col] = buffer[i];
  160.             row++;
  161.             col = 1;
  162.         }
  163.         else{
  164.             matrix[row][col] = buffer[i];
  165.             col++;
  166.         }
  167.     }
  168.  
  169.     if(matrix[day + 4][hour + 6] == 'X')
  170.         ;
  171.     else{
  172.            savetty();
  173.         initscr();        /* initialize screen                */
  174.         refresh();
  175.         clear();        /* Clear the screen                 */
  176.         for(i=0;i<=numread;i++)
  177.             printf("%c",buffer[i]);
  178.         endwin();
  179.         resetty();
  180.         exit(0);
  181.     }
  182. }
  183.  
  184. dis_open_scr()
  185. {
  186.     char scr[2048];
  187.     char screen[23][80];
  188.     int fd,nr,ind;
  189.  
  190.     (void) strcpy(f_nam,OPEN_SCR);
  191.     if((fd = open(f_nam,O_RDONLY)) < 0){
  192.         printf("No Opening screen file, Aborting.");
  193.         end_game();
  194.     }
  195.     else
  196.         if((nr =  read(fd,scr,2048)) < 1){
  197.             printf("Nothing in Opening credit file.");
  198.             end_game();
  199.         }
  200.     else{
  201.         move(0,0);
  202.         for(ind=0;ind<nr;ind++)
  203.             printw("%c",scr[ind]);
  204.         move(23,0);
  205.         printw("Press any key to Continue. ");
  206.         refresh();
  207.         getch();
  208.         clear();
  209.         refresh();
  210.     }
  211.     close(fd);
  212. }
  213.  
  214. score_list()
  215. {
  216.     int len;
  217.  
  218.     tmp.score = char_stats.experience;
  219.     tmp.level = char_stats.level;
  220.     strcpy(tmp.name, char_stats.Name);
  221.  
  222.     if(read_it() == -1){
  223.         out[0].score = tmp.score;
  224.         out[0].level = tmp.level;
  225.         strcpy(out[0].name, tmp.name);
  226.         strcpy(out[0].death_by,tmp.death_by);
  227.     }
  228.     else
  229.         configure();
  230.     write_it();
  231.     print_scores();
  232. }
  233.  
  234. write_it()
  235. {
  236.     FILE *fp;
  237.     int make;
  238.  
  239.     (void) strcpy(f_nam,SCORES);
  240.     if((fp = fopen(f_nam,"w")) == (FILE *)NULL){
  241.         fprintf(stderr,"Cannot open file.\n");
  242.         if((make = creat(f_nam,PERMS)) < 0)
  243.             fprintf("Error in making score File.");
  244.         exit(1);
  245.     }
  246.     if(fwrite((char *)out, sizeof(out),1,fp) != 1){
  247.         fprintf(stderr,"Cannot open file.\n");
  248.         exit(1);
  249.     }
  250.     fclose(fp);
  251. }
  252.  
  253. read_it()
  254. {
  255.     FILE *fp;
  256.     int make;
  257.  
  258.     (void) strcpy(f_nam,SCORES);
  259.     if((fp = fopen(f_nam,"r")) == (FILE *)NULL){
  260.         if((make = creat(SCORES,PERMS)) < 0)
  261.             exit(1);
  262.     }
  263.     else
  264.         if(fread((char *)in, sizeof(in),1,fp) != 1){
  265.             fprintf(stderr,"Cannot open file.\n");
  266.             return(-1);
  267.         }
  268.     fclose(fp);
  269. }
  270.  
  271.  
  272. configure()
  273. {
  274.     int inloc = 0;
  275.     int outloc = 0;
  276.  
  277.     do
  278.         {
  279.         if(tmp.score >= in[inloc].score){
  280.             out[outloc].score = tmp.score;
  281.             out[outloc].level = tmp.level;
  282.             strcpy(out[outloc].name, tmp.name);
  283.             strcpy(out[outloc].death_by,tmp.death_by);
  284.             outloc++;
  285.             out[outloc].score = in[inloc].score;
  286.             out[outloc].level = in[inloc].level;
  287.             strcpy(out[outloc].name,in[inloc].name);
  288.             strcpy(out[outloc].death_by,in[inloc].death_by);
  289.             outloc++;
  290.             inloc++;
  291.             tmp.score = -1;
  292.         }
  293.         else
  294.             if(tmp.score < in[inloc].score){
  295.                 out[outloc].score = in[inloc].score;
  296.                 out[outloc].level = in[inloc].level;
  297.                 strcpy(out[outloc].name,in[inloc].name);
  298.                 strcpy(out[outloc].death_by,in[inloc].death_by);
  299.                 outloc++;
  300.                 inloc++;
  301.             }
  302.         else{
  303.             out[outloc].score = tmp.score;
  304.             out[outloc].level = tmp.level;
  305.             strcpy(out[outloc].name, tmp.name);
  306.             strcpy(out[outloc].death_by,tmp.death_by);
  307.             outloc++;
  308.         }
  309.     }
  310.     while(outloc <= 19);
  311. }
  312.  
  313. print_scores()
  314. {
  315.     int ind = 0,finished = FALSE;
  316.     int start = 2;
  317.  
  318.     clear();
  319.     move(0,0);
  320.     printw("Rank");
  321.     move(0,5);
  322.     printw("Name");
  323.     move(0,20);
  324.     printw("Score");
  325.     move(0,30);
  326.     printw("Level");
  327.     move(0,40);
  328.     printw("Killed by");
  329.     move(1,0);
  330.     printw("-------------------------------------------------");
  331.     do
  332.         {
  333.         if(out[ind].level == 0)
  334.             finished = TRUE;
  335.         else{
  336.             move(start + ind,0);
  337.             printw("%d)",ind + 1);
  338.             move(start + ind,5);
  339.             printw("%s",out[ind].name);
  340.             move(start + ind,20);
  341.             printw("%d",out[ind].score);
  342.             move(start + ind,30);
  343.             printw("%d",out[ind].level);
  344.             move(start + ind,40);
  345.             printw("%s",out[ind].death_by);
  346.             ind++;
  347.         }
  348.     }
  349.     while(ind <= 19 && !finished);
  350.     move(23,0);
  351.     printw("Press any key to Continue.");
  352.     refresh();
  353.     getch();
  354.     move(23,0);
  355.     clrtoeol();
  356. }
  357.  
  358. prn_scores()
  359. {
  360.     int ind = 0,finished = FALSE;
  361.     int start = 2;
  362.  
  363.     initscr();
  364.     clear();
  365.     if(read_it() > 0){
  366.         move(0,0);
  367.         printw("Rank");
  368.         move(0,5);
  369.         printw("Name");
  370.         move(0,20);
  371.         printw("Score");
  372.         move(0,30);
  373.         printw("Level");
  374.         move(0,40);
  375.         printw("Killed by");
  376.         move(1,0);
  377.         printw("-------------------------------------------------");
  378.         do
  379.             {
  380.             if(in[ind].level == 0)
  381.                 finished = TRUE;
  382.             else{
  383.                 move(start + ind,0);
  384.                 printw("%d)",ind + 1);
  385.                 move(start + ind,5);
  386.                 printw("%s",in[ind].name);
  387.                 move(start + ind,20);
  388.                 printw("%d",in[ind].score);
  389.                 move(start + ind,30);
  390.                 printw("%d",in[ind].level);
  391.                 move(start + ind,40);
  392.                 printw("%s",in[ind].death_by);
  393.                 ind++;
  394.             }
  395.         }
  396.         while(ind <= 19 && !finished);
  397.         move(23,0);
  398.         printw("Press any key to Continue.");
  399.         refresh();
  400.         getch();
  401.         clear();
  402.     }
  403.     end_game();
  404. }
  405.  
  406.  
  407. save()
  408. {
  409.     FILE *fp;
  410.     int nwrite,ct,fd,i;
  411.     char savfil[50];
  412.     int inv_rec[16];
  413.  
  414.     for(i=0;i<=15;i++)
  415.         inv_rec[i] = -1;
  416.     posi.row = p->row;
  417.     posi.col = p->col;
  418.     posi.level = p->level;
  419.     posi.face = p->face;
  420.     posi.screen = p->screen;
  421.     posi.compass_on = p->compass_on;
  422.     posi.move_count = p->move_count;
  423.     temp = firstnode;
  424.     i = 1;
  425.     do
  426.         {
  427.         inv_rec[i] = temp->item_no;
  428.         i++;
  429.         temp = temp->next;
  430.     }
  431.     while(temp->next != NULL);
  432.     inv_rec[0] = i;
  433.     if(temp->next == NULL)
  434.         inv_rec[i] = temp->item_no;
  435.     save_inven();
  436.  
  437.     sprintf(savfil,"%s%s",SAVE_DIR,user.acct);
  438.     if((fp = fopen(savfil,"w")) == (FILE *)NULL){
  439.         fprintf(stderr,"Cannot open a savefile for you.\n");
  440.         if((fd = creat(savfil,0777)) < 0){
  441.             printw("Cannot create the Save file.");
  442.             refresh();
  443.         }              
  444.     }
  445.     clear();
  446.     refresh();
  447.     if(fwrite((char *)&char_stats, sizeof(char_stats),1,fp) != 1){
  448.         fprintf(stderr,"Cannot write to file.");
  449.     }
  450.     if(fwrite((char *)&posi, sizeof(posi),1,fp) != 1){
  451.         fprintf(stderr,"Cannot write to file.");
  452.     }
  453.     if(fwrite((char *)levels, sizeof(levels),1,fp) != 1){
  454.         fprintf(stderr,"Cannot write to file.");
  455.     }
  456.     if(fwrite((char *)&ct_compass, sizeof(int),1,fp) != 1){
  457.         fprintf(stderr,"Cannot write to file.");
  458.     }
  459.     if(fwrite((char *)&ct_dtrap, sizeof(int),1,fp) != 1){
  460.         fprintf(stderr,"Cannot write to file.");
  461.     }
  462.     if(fwrite((char *)&showit, sizeof(int),1,fp) != 1){
  463.         fprintf(stderr,"Cannot write to file.");
  464.     }
  465.     if(fwrite((char *)&detect, sizeof(int),1,fp) != 1){
  466.         fprintf(stderr,"Cannot write to file.");
  467.     }
  468.     if(fwrite((char *)&d_val, sizeof(int),1,fp) != 1){
  469.         fprintf(stderr,"Cannot write to file.");
  470.     }
  471.     if(fwrite((char *)&d_mod, sizeof(int),1,fp) != 1){
  472.         fprintf(stderr,"Cannot write to file.");
  473.     }
  474.     if(fwrite((char *)&which_one, sizeof(int),1,fp) != 1){
  475.         fprintf(stderr,"Cannot write to file.");
  476.     }
  477.     if(fwrite((char *)&mon_faced, sizeof(int),1,fp) != 1){
  478.         fprintf(stderr,"Cannot write to file.");
  479.     }
  480.     if(fwrite((char *)known, sizeof(known),1,fp) != 1){
  481.         fprintf(stderr,"Cannot write to file.");
  482.     }
  483.     if(fwrite((char *)lvl_att, sizeof(lvl_att),1,fp) != 1){
  484.         fprintf(stderr,"Cannot write to file.");
  485.     }
  486.     if(fwrite((char *)inv_rec, sizeof(inv_rec),1,fp) != 1){
  487.         fprintf(stderr,"Cannot write to file.");
  488.     }
  489.     if(fwrite((char *)s_inven, sizeof(s_inven),1,fp) != 1){
  490.         fprintf(stderr,"Cannot write to file.");
  491.     }
  492.  
  493.     fclose(fp);
  494.     printw("Saving!");
  495.     refresh();
  496.     sleep(2);
  497.     end_game();
  498. }
  499.  
  500. recover()
  501. {
  502.     FILE *fp;
  503.     int nwrite,ct,fd,i;
  504.     char savfil[50];
  505.     int inv_rec[16];
  506.     struct stat st_buff;
  507.  
  508.     sprintf(savfil,"%s%s",SAVE_DIR,user.acct);
  509.     if((fp = fopen(savfil,"r")) == (FILE *)NULL){
  510.         fprintf(stderr,"Sorry you don\'t have a saved game.\n");
  511.         end_game();
  512.     }
  513.     if(fread((char *)&char_stats, sizeof(char_stats),1,fp) != 1){
  514.         fprintf(stderr,"Cannot write to file.");
  515.     }
  516.     if(fread((char *)&posi, sizeof(posi),1,fp) != 1){
  517.         fprintf(stderr,"Cannot write to file.");
  518.     }
  519.     if(fread((char *)levels, sizeof(levels),1,fp) != 1){
  520.         fprintf(stderr,"Cannot write to file.");
  521.     }
  522.     if(fread((char *)&ct_compass, sizeof(int),1,fp) != 1){
  523.         fprintf(stderr,"Cannot write to file.");
  524.     }
  525.     if(fread((char *)&ct_dtrap, sizeof(int),1,fp) != 1){
  526.         fprintf(stderr,"Cannot write to file.");
  527.     }
  528.     if(fread((char *)&showit, sizeof(int),1,fp) != 1){
  529.         fprintf(stderr,"Cannot write to file.");
  530.     }
  531.     if(fread((char *)&detect, sizeof(int),1,fp) != 1){
  532.         fprintf(stderr,"Cannot write to file.");
  533.     }
  534.     if(fread((char *)&d_val, sizeof(int),1,fp) != 1){
  535.         fprintf(stderr,"Cannot write to file.");
  536.     }
  537.     if(fread((char *)&d_mod, sizeof(int),1,fp) != 1){
  538.         fprintf(stderr,"Cannot write to file.");
  539.     }
  540.     if(fread((char *)&which_one, sizeof(int),1,fp) != 1){
  541.         fprintf(stderr,"Cannot write to file.");
  542.     }
  543.     if(fread((char *)&mon_faced, sizeof(int),1,fp) != 1){
  544.         fprintf(stderr,"Cannot write to file.");
  545.     }
  546.     if(fread((char *)known, sizeof(known),1,fp) != 1){
  547.         fprintf(stderr,"Cannot write to file.");
  548.     }
  549.     if(fread((char *)lvl_att, sizeof(lvl_att),1,fp) != 1){
  550.         fprintf(stderr,"Cannot write to file.");
  551.     }
  552.     if(fread((char *)inv_rec, sizeof(inv_rec),1,fp) != 1){
  553.         fprintf(stderr,"Cannot write to file.");
  554.     }
  555.     if(fread((char *)s_inven, sizeof(s_inven),1,fp) != 1){
  556.         fprintf(stderr,"Cannot write to file.");
  557.     }
  558.  
  559.     fclose(fp);
  560.     if(stat(savfil,&st_buff) < 0)
  561.        fprintf(stderr,"ERROR: Could not stat file.\n");
  562.     else
  563.        if(unlink(savfil) < 0)
  564.          fprintf(stderr,"ERROR: %s Not Removed.\n",savfil);
  565.  
  566.     p->row = posi.row;
  567.     p->col = posi.col;
  568.     p->level = posi.level;
  569.     p->face = posi.face;
  570.     p->screen = posi.screen;
  571.     p->compass_on = posi.compass_on;
  572.     p->move_count = posi.move_count;
  573.     char_stats.ac = 0;
  574.     d_val = 3;
  575.     d_mod = 1;
  576.  
  577. /*    oldnode = (list *) malloc(sizeof(list));
  578.     firstnode = oldnode;  */
  579.     init_list();
  580.  
  581.     for(i=1;i<=inv_rec[0];i++)
  582.         add_item(inv_rec[i]);
  583.     oldnode = firstnode; 
  584.     firstnode = oldnode->next;
  585.     oldnode->next->prev = NULL;
  586.     oldnode->next = NULL;
  587.     temp = firstnode;
  588.  
  589.     i = 0;
  590.     do{
  591.       temp->item_type = s_inven[i].item_type;
  592.       temp->armor_val = s_inven[i].armor_val;
  593.       temp->dam_val = s_inven[i].dam_val;
  594.       temp->dam_mod = s_inven[i].dam_mod;
  595.       temp->item_no = s_inven[i].item_no;
  596.       temp->special = s_inven[i].special;
  597.       temp->used = s_inven[i].used;
  598.       if(temp->used == TRUE)
  599.       switch (temp->item_type){
  600.          case 1: char_stats.ac += temp->armor_val;
  601.              break;
  602.          case 2: char_stats.ac += temp->armor_val;
  603.              break;
  604.          case 3: char_stats.ac += temp->armor_val;
  605.              break;
  606.          case 4: char_stats.ac += temp->armor_val;
  607.              break;
  608.          case 5: char_stats.ac += temp->armor_val;
  609.              break;
  610.          case 6: d_val = temp->dam_val;
  611.               d_mod = temp->dam_mod;
  612.              break;
  613.          default : break;
  614.       }
  615.       i++;
  616.       temp = temp->next;
  617.     if(temp->next == NULL){
  618.       temp->item_type = s_inven[i].item_type;
  619.       temp->armor_val = s_inven[i].armor_val;
  620.       temp->dam_val = s_inven[i].dam_val;
  621.       temp->dam_mod = s_inven[i].dam_mod;
  622.       temp->item_no = s_inven[i].item_no;
  623.       temp->special = s_inven[i].special;
  624.       temp->used = s_inven[i].used;
  625.       if(temp->used == TRUE)
  626.       switch (temp->item_type){
  627.          case 1: char_stats.ac += temp->armor_val;
  628.              break;
  629.          case 2: char_stats.ac += temp->armor_val;
  630.              break;
  631.          case 3: char_stats.ac += temp->armor_val;
  632.              break;
  633.          case 4: char_stats.ac += temp->armor_val;
  634.              break;
  635.          case 5: char_stats.ac += temp->armor_val;
  636.              break;
  637.          case 6: d_val = temp->dam_val;
  638.               d_mod = temp->dam_mod;
  639.              break;
  640.          default : break;
  641.       }
  642.      }
  643.     }while(temp->next != NULL);
  644. }
  645.  
  646. save_inven()
  647. {
  648.     int i = 0;
  649.     temp = firstnode;
  650.  
  651.     do{
  652.        (void) strcpy(s_inven[i].item,temp->item);
  653.        s_inven[i].item_type = temp->item_type;
  654.        s_inven[i].armor_val = temp->armor_val;
  655.        s_inven[i].dam_val = temp->dam_val;
  656.        s_inven[i].dam_mod = temp->dam_mod;
  657.        s_inven[i].item_no = temp->item_no;
  658.        s_inven[i].special = temp->special;
  659.        s_inven[i].used = temp->used;
  660.        i++;
  661.        temp = temp->next;
  662.        if(temp->next == NULL){
  663.          (void) strcpy(s_inven[i].item,temp->item);
  664.          s_inven[i].item_type = temp->item_type;
  665.          s_inven[i].armor_val = temp->armor_val;
  666.          s_inven[i].dam_val = temp->dam_val;
  667.          s_inven[i].dam_mod = temp->dam_mod;
  668.          s_inven[i].item_no = temp->item_no;
  669.          s_inven[i].special = temp->special;
  670.          s_inven[i].used = temp->used;
  671.        }
  672.     }while(temp->next != NULL && i != 15);
  673. }
  674.  
  675.  
  676. mail_help()
  677. {
  678. }
  679.