rnd-19980925
[rocksndiamonds.git] / src / files.c
1 /***********************************************************
2 *  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
3 *----------------------------------------------------------*
4 *  ©1995 Artsoft Development                               *
5 *        Holger Schemel                                    *
6 *        33659 Bielefeld-Senne                             *
7 *        Telefon: (0521) 493245                            *
8 *        eMail: aeglos@valinor.owl.de                      *
9 *               aeglos@uni-paderborn.de                    *
10 *               q99492@pbhrzx.uni-paderborn.de             *
11 *----------------------------------------------------------*
12 *  files.h                                                 *
13 ***********************************************************/
14
15 #include "files.h"
16 #include "tools.h"
17 #include "misc.h"
18 #include "tape.h"
19 #include "joystick.h"
20
21 BOOL CreateNewScoreFile()
22 {
23   int i,j,k;
24   char filename[MAX_FILENAME];
25   char empty_alias[MAX_NAMELEN];
26   FILE *file;
27
28   sprintf(filename,"%s/%s/%s",
29           level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
30
31   if (!(file=fopen(filename,"w")))
32     return(FALSE);
33
34   for(i=0;i<MAX_NAMELEN;i++)
35     empty_alias[i] = 0;
36   strncpy(empty_alias,EMPTY_ALIAS,MAX_NAMELEN-1);
37
38   fputs(SCORE_COOKIE,file);             /* Formatkennung */
39   for(i=0;i<leveldir[leveldir_nr].levels;i++)
40   {
41     for(j=0;j<MAX_SCORE_ENTRIES;j++)
42     {
43       for(k=0;k<MAX_NAMELEN;k++)
44         fputc(empty_alias[k],file);
45       fputc(0,file);
46       fputc(0,file);
47     }
48   }
49   fclose(file);
50
51   chmod(filename, SCORE_PERMS);
52   return(TRUE);
53 }
54
55 BOOL CreateNewNamesFile(int mode)
56 {
57   char filename[MAX_FILENAME];
58   FILE *file;
59
60   if (mode==PLAYER_LEVEL)
61     sprintf(filename,"%s/%s/%s",
62             level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
63   else
64     sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
65
66   if (!(file=fopen(filename,"w")))
67     return(FALSE);
68
69   fputs(NAMES_COOKIE,file);             /* Formatkennung */
70   fclose(file);
71
72   chmod(filename, NAMES_PERMS);
73   return(TRUE);
74 }
75
76 BOOL LoadLevelInfo()
77 {
78   int i;
79   char filename[MAX_FILENAME];
80   char cookie[MAX_FILENAME];
81   FILE *file;
82
83   sprintf(filename,"%s/%s",level_directory,LEVDIR_FILENAME);
84
85   if (!(file=fopen(filename,"r")))
86   {
87     fprintf(stderr,"%s: cannot load level info '%s'!\n",progname,filename);
88     return(FALSE);
89   }
90
91   fscanf(file,"%s\n",cookie);
92   if (strcmp(cookie,LEVELDIR_COOKIE))   /* ungültiges Format? */
93   {
94     fprintf(stderr,"%s: wrong format of level info file!\n",progname);
95     fclose(file);
96     return(FALSE);
97   }
98
99   num_leveldirs = 0;
100   leveldir_nr = 0;
101   for(i=0;i<MAX_LEVDIR_ENTRIES;i++)
102   {
103     fscanf(file,"%s",leveldir[i].filename);
104     fscanf(file,"%s",leveldir[i].name);
105     fscanf(file,"%d",&leveldir[i].levels);
106     fscanf(file,"%d",&leveldir[i].readonly);
107     if (feof(file))
108       break;
109
110     num_leveldirs++;
111   }
112
113   if (!num_leveldirs)
114   {
115     fprintf(stderr,"%s: empty level info '%s'!\n",progname,filename);
116     return(FALSE);
117   }
118
119   return(TRUE);
120 }
121
122 void LoadLevel(int level_nr)
123 {
124   int i,x,y;
125   char filename[MAX_FILENAME];
126   char cookie[MAX_FILENAME];
127   FILE *file;
128
129   sprintf(filename,"%s/%s/%d",
130           level_directory,leveldir[leveldir_nr].filename,level_nr);
131
132   if (!(file=fopen(filename,"r")))
133   {
134 /*
135     fprintf(stderr,"%s: cannot load level '%s'!\n",progname,filename);
136 */
137   }
138   else
139   {
140     fgets(cookie,LEVEL_COOKIE_LEN,file);
141     fgetc(file);
142
143     if (strcmp(cookie,LEVEL_COOKIE))    /* ungültiges Format? */
144     {
145       fprintf(stderr,"%s: wrong format of level file '%s'!\n",
146               progname,filename);
147       fclose(file);
148       file = NULL;
149     }
150   }
151
152   if (file)
153   {
154     lev_fieldx = level.fieldx = fgetc(file);
155     lev_fieldy = level.fieldy = fgetc(file);
156
157     level.time          = (fgetc(file)<<8) | fgetc(file);
158     level.edelsteine    = (fgetc(file)<<8) | fgetc(file);
159     for(i=0;i<MAX_LEVNAMLEN;i++)
160       level.name[i]     = fgetc(file);
161     level.name[MAX_LEVNAMLEN-1] = 0;
162     for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
163       level.score[i]    = fgetc(file);
164     for(i=0;i<4;i++)
165       for(y=0;y<3;y++)
166         for(x=0;x<3;x++)
167           level.mampfer_inhalt[i][x][y] = fgetc(file);
168     level.tempo_amoebe  = fgetc(file);
169     level.dauer_sieb    = fgetc(file);
170     level.dauer_ablenk  = fgetc(file);
171     level.amoebe_inhalt = fgetc(file);
172
173     for(i=0;i<NUM_FREE_LVHD_BYTES;i++)  /* Rest frei / Headergröße 80 Bytes */
174       fgetc(file);
175
176     for(y=0;y<MAX_LEV_FIELDY;y++) 
177       for(x=0;x<MAX_LEV_FIELDX;x++) 
178         Feld[x][y] = Ur[x][y] = EL_ERDREICH;
179
180     for(y=0;y<lev_fieldy;y++) 
181       for(x=0;x<lev_fieldx;x++) 
182         Feld[x][y] = Ur[x][y] = fgetc(file);
183
184     fclose(file);
185
186     if (level.time<=10) /* Mindestspieldauer */
187       level.time = 10;
188   }
189   else
190   {
191     lev_fieldx = level.fieldx = STD_LEV_FIELDX;
192     lev_fieldy = level.fieldy = STD_LEV_FIELDY;
193
194     level.time          = 100;
195     level.edelsteine    = 0;
196     strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
197     for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
198       level.score[i]    = 10;
199     for(i=0;i<4;i++)
200       for(y=0;y<3;y++)
201         for(x=0;x<3;x++)
202           level.mampfer_inhalt[i][x][y] = EL_FELSBROCKEN;
203     level.tempo_amoebe  = 10;
204     level.dauer_sieb    = 10;
205     level.dauer_ablenk  = 10;
206     level.amoebe_inhalt = EL_DIAMANT;
207
208     for(y=0;y<STD_LEV_FIELDY;y++) 
209       for(x=0;x<STD_LEV_FIELDX;x++) 
210         Feld[x][y] = Ur[x][y] = EL_ERDREICH;
211     Feld[0][0] = Ur[0][0] = EL_SPIELFIGUR;
212     Feld[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
213       Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_AUSGANG_ZU;
214   }
215 }
216
217 void LoadLevelTape(int level_nr)
218 {
219   int i;
220   char filename[MAX_FILENAME];
221   char cookie[MAX_FILENAME];
222   FILE *file;
223
224 #ifndef MSDOS
225   sprintf(filename,"%s/%s/%d.tape",
226           level_directory,leveldir[leveldir_nr].filename,level_nr);
227 #else
228   sprintf(filename,"%s/%s/%d.tap",
229           level_directory,leveldir[leveldir_nr].filename,level_nr);
230 #endif
231
232   if ((file=fopen(filename,"r")))
233   {
234     fgets(cookie,LEVELREC_COOKIE_LEN,file);
235     fgetc(file);
236     if (strcmp(cookie,LEVELREC_COOKIE)) /* ungültiges Format? */
237     {
238       fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
239               progname,filename);
240       fclose(file);
241       file = NULL;
242     }
243   }
244
245   if (!file)
246     return;
247
248   tape.random_seed =
249     (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
250   tape.date =
251     (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
252   tape.length =
253     (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
254
255   tape.level_nr = level_nr;
256   tape.counter = 0;
257   tape.changed = FALSE;
258
259   tape.recording = FALSE;
260   tape.playing = FALSE;
261   tape.pausing = FALSE;
262
263   for(i=0;i<tape.length;i++)
264   {
265     if (i>=MAX_TAPELEN)
266       break;
267     tape.pos[i].joystickdata = fgetc(file);
268     tape.pos[i].delay        = fgetc(file);
269     if (feof(file))
270       break;
271   }
272
273   fclose(file);
274
275   if (i != tape.length)
276     fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
277             progname,filename);
278
279   tape.length_seconds = GetTapeLength();
280 }
281
282 void LoadScore(int level_nr)
283 {
284   int i,j;
285   char filename[MAX_FILENAME];
286   char cookie[MAX_FILENAME];
287   FILE *file;
288
289   sprintf(filename,"%s/%s/%s",
290           level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
291
292   if (!(file=fopen(filename,"r")))
293   {
294     if (!CreateNewScoreFile())
295     {
296       fprintf(stderr,"%s: cannot create score file '%s'!\n",
297               progname,filename);
298     }
299     else if (!(file=fopen(filename,"r"))) 
300     {
301       fprintf(stderr,"%s: cannot load score for level %d!\n",
302               progname,level_nr);
303     }
304   }
305
306   if (file)
307   {
308     fgets(cookie,SCORE_COOKIE_LEN,file);
309     if (strcmp(cookie,SCORE_COOKIE))    /* ungültiges Format? */
310     {
311       fprintf(stderr,"%s: wrong format of score file!\n",progname);
312       fclose(file);
313       file = NULL;
314     }
315   }
316
317   if (file)
318   {
319     fseek(file,
320           SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
321           SEEK_SET);
322     for(i=0;i<MAX_SCORE_ENTRIES;i++)
323     {
324       for(j=0;j<MAX_NAMELEN;j++)
325         highscore[i].Name[j] = fgetc(file);
326       highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
327     }
328     fclose(file);
329   }
330   else
331   {
332     for(i=0;i<MAX_SCORE_ENTRIES;i++)
333     {
334       strcpy(highscore[i].Name,EMPTY_ALIAS);
335       highscore[i].Score = 0;
336     }
337   }
338 }
339
340 void LoadPlayerInfo(int mode)
341 {
342   int i;
343   char filename[MAX_FILENAME];
344   char cookie[MAX_FILENAME];
345   FILE *file;
346   char *login_name = GetLoginName();
347   struct PlayerInfo default_player, new_player;
348   int version_10_file = FALSE;
349
350   if (mode==PLAYER_LEVEL)
351     sprintf(filename,"%s/%s/%s",
352             level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
353   else
354     sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
355
356   for(i=0;i<MAX_NAMELEN;i++)
357     default_player.login_name[i] = default_player.alias_name[i] = 0;
358   strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
359   strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
360   default_player.handicap = 0;
361   default_player.setup = DEFAULT_SETUP;
362   default_player.leveldir_nr = 0;
363   default_player.level_nr = 0;
364
365   new_player = default_player;
366
367   if (!(file=fopen(filename,"r")))
368   {
369     if (!CreateNewNamesFile(mode))
370     {
371       fprintf(stderr,"%s: cannot create names file '%s'!\n",
372               progname,filename);
373     }
374     else if (!(file=fopen(filename,"r"))) 
375     {
376       fprintf(stderr,"%s: cannot load player information '%s'!\n",
377               progname,filename);
378     }
379   }
380
381   if (file)
382   {
383     fgets(cookie,NAMES_COOKIE_LEN,file);
384     if (!strcmp(cookie,NAMES_COOKIE_10))        /* altes Format? */
385       version_10_file = TRUE;
386     else if (strcmp(cookie,NAMES_COOKIE))       /* ungültiges Format? */
387     {
388       fprintf(stderr,"%s: wrong format of names file '%s'!\n",
389               progname,filename);
390       fclose(file);
391       file = NULL;
392     }
393   }
394
395   if (!file)
396   {
397     *local_player = default_player;
398     level_nr = default_player.level_nr;
399     return;
400   }
401
402   while(1)
403   {
404     for(i=0;i<MAX_NAMELEN;i++)
405       new_player.login_name[i] = fgetc(file);
406     for(i=0;i<MAX_NAMELEN;i++)
407       new_player.alias_name[i] = fgetc(file);
408     new_player.handicap = fgetc(file);
409     new_player.setup = (fgetc(file)<<8) | fgetc(file);
410     new_player.leveldir_nr = fgetc(file);
411     if (!version_10_file)
412     {
413       new_player.level_nr = fgetc(file);
414       for(i=0;i<10;i++)         /* currently unused bytes */
415         fgetc(file);
416     }
417     else
418       new_player.level_nr = new_player.handicap;
419
420     if (feof(file))             /* Spieler noch nicht in Liste enthalten */
421     {
422       new_player = default_player;
423
424       fclose(file);
425       if (!(file=fopen(filename,"a")))
426       {
427         fprintf(stderr,"%s: cannot append new player to names file '%s'!\n",
428                 progname,filename);
429       }
430       else
431       {
432         for(i=0;i<MAX_NAMELEN;i++)
433           fputc(new_player.login_name[i],file);
434         for(i=0;i<MAX_NAMELEN;i++)
435           fputc(new_player.alias_name[i],file);
436         fputc(new_player.handicap,file);
437         fputc(new_player.setup / 256,file);
438         fputc(new_player.setup % 256,file);
439         fputc(new_player.leveldir_nr,file);
440         if (!version_10_file)
441         {
442           fputc(new_player.level_nr,file);
443           for(i=0;i<10;i++)     /* currently unused bytes */
444             fputc(0,file);
445         }
446       }
447       break;
448     }
449     else                        /* prüfen, ob Spieler in Liste enthalten */
450       if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
451         break;
452   }
453
454   if (mode==PLAYER_SETUP)
455   {
456     *local_player = new_player;
457     if (local_player->leveldir_nr < num_leveldirs)
458       leveldir_nr = local_player->leveldir_nr;
459     else
460       leveldir_nr = 0;
461   }
462   else
463   {
464     local_player->handicap = new_player.handicap;
465     local_player->level_nr = new_player.level_nr;
466   }
467
468   level_nr = local_player->level_nr;
469   fclose(file);
470 }
471
472 void SaveLevel(int level_nr)
473 {
474   int i,x,y;
475   char filename[MAX_FILENAME];
476   FILE *file;
477
478   sprintf(filename,"%s/%s/%d",
479           level_directory,leveldir[leveldir_nr].filename,level_nr);
480
481   if (!(file=fopen(filename,"w")))
482   {
483     fprintf(stderr,"%s: cannot save level file '%s'!\n",progname,filename);
484     return;
485   }
486
487   fputs(LEVEL_COOKIE,file);             /* Formatkennung */
488   fputc(0x0a,file);
489
490   fputc(level.fieldx,file);
491   fputc(level.fieldy,file);
492   fputc(level.time / 256,file);
493   fputc(level.time % 256,file);
494   fputc(level.edelsteine / 256,file);
495   fputc(level.edelsteine % 256,file);
496
497   for(i=0;i<MAX_LEVNAMLEN;i++)
498     fputc(level.name[i],file);
499   for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
500     fputc(level.score[i],file);
501   for(i=0;i<4;i++)
502     for(y=0;y<3;y++)
503       for(x=0;x<3;x++)
504         fputc(level.mampfer_inhalt[i][x][y],file);
505   fputc(level.tempo_amoebe,file);
506   fputc(level.dauer_sieb,file);
507   fputc(level.dauer_ablenk,file);
508   fputc(level.amoebe_inhalt,file);
509
510   for(i=0;i<NUM_FREE_LVHD_BYTES;i++)    /* Rest frei / Headergröße 80 Bytes */
511     fputc(0,file);
512
513   for(y=0;y<lev_fieldy;y++) 
514     for(x=0;x<lev_fieldx;x++) 
515       fputc(Ur[x][y],file);
516
517   fclose(file);
518
519   chmod(filename, LEVEL_PERMS);
520 }
521
522 void SaveLevelTape(int level_nr)
523 {
524   int i;
525   char filename[MAX_FILENAME];
526   FILE *file;
527   BOOL new_tape = TRUE;
528
529 #ifndef MSDOS
530   sprintf(filename,"%s/%s/%d.tape",
531           level_directory,leveldir[leveldir_nr].filename,level_nr);
532 #else
533   sprintf(filename,"%s/%s/%d.tap",
534           level_directory,leveldir[leveldir_nr].filename,level_nr);
535 #endif
536
537   /* Testen, ob bereits eine Aufnahme existiert */
538   if ((file=fopen(filename,"r")))
539   {
540     new_tape = FALSE;
541     fclose(file);
542
543     if (!AreYouSure("Replace old tape ?",AYS_ASK))
544       return;
545   }
546
547   if (!(file=fopen(filename,"w")))
548   {
549     fprintf(stderr,"%s: cannot save level recording file '%s'!\n",
550             progname,filename);
551     return;
552   }
553
554   fputs(LEVELREC_COOKIE,file);          /* Formatkennung */
555   fputc(0x0a,file);
556
557   fputc((tape.random_seed >> 24) & 0xff,file);
558   fputc((tape.random_seed >> 16) & 0xff,file);
559   fputc((tape.random_seed >>  8) & 0xff,file);
560   fputc((tape.random_seed >>  0) & 0xff,file);
561
562   fputc((tape.date >>  24) & 0xff,file);
563   fputc((tape.date >>  16) & 0xff,file);
564   fputc((tape.date >>   8) & 0xff,file);
565   fputc((tape.date >>   0) & 0xff,file);
566
567   fputc((tape.length >>  24) & 0xff,file);
568   fputc((tape.length >>  16) & 0xff,file);
569   fputc((tape.length >>   8) & 0xff,file);
570   fputc((tape.length >>   0) & 0xff,file);
571
572   for(i=0;i<tape.length;i++)
573   {
574     fputc(tape.pos[i].joystickdata,file);
575     fputc(tape.pos[i].delay,file);
576   }
577
578   fclose(file);
579
580   chmod(filename, LEVREC_PERMS);
581
582   tape.changed = FALSE;
583
584   if (new_tape)
585     AreYouSure("tape saved !",AYS_CONFIRM);
586 }
587
588 void SaveScore(int level_nr)
589 {
590   int i,j;
591   char filename[MAX_FILENAME];
592   FILE *file;
593
594   sprintf(filename,"%s/%s/%s",
595           level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
596
597   if (!(file=fopen(filename,"r+")))
598   {
599     fprintf(stderr,"%s: cannot save score for level %d!\n",
600             progname,level_nr);
601     return;
602   }
603
604   fseek(file,
605         SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
606         SEEK_SET);
607   for(i=0;i<MAX_SCORE_ENTRIES;i++)
608   {
609     for(j=0;j<MAX_NAMELEN;j++)
610       fputc(highscore[i].Name[j],file);
611     fputc(highscore[i].Score / 256,file);
612     fputc(highscore[i].Score % 256,file);
613   }
614   fclose(file);
615 }
616
617 void SavePlayerInfo(int mode)
618 {
619   int i;
620   char filename[MAX_FILENAME];
621   char cookie[MAX_FILENAME];
622   FILE *file;
623   struct PlayerInfo default_player;
624   int version_10_file = FALSE;
625
626   if (mode==PLAYER_LEVEL)
627     sprintf(filename,"%s/%s/%s",
628             level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
629   else
630     sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
631
632   if (!(file=fopen(filename,"r+")))
633   {
634     fprintf(stderr,"%s: cannot save player information '%s'!\n",
635             progname,filename);
636     return;
637   }
638
639   fgets(cookie,NAMES_COOKIE_LEN,file);
640   if (!strcmp(cookie,NAMES_COOKIE_10))  /* altes Format? */
641     version_10_file = TRUE;
642   else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
643   {
644     fprintf(stderr,"%s: wrong format of names file '%s'!\n",
645             progname,filename);
646     fclose(file);
647     return;
648   }
649
650   while(1)
651   {
652     for(i=0;i<MAX_NAMELEN;i++)
653       default_player.login_name[i] = fgetc(file);
654     for(i=0;i<MAX_NAMELEN;i++)
655       default_player.alias_name[i] = fgetc(file);
656     default_player.handicap = fgetc(file);
657     default_player.setup = (fgetc(file)<<8) | fgetc(file);
658     default_player.leveldir_nr = fgetc(file);
659     if (!version_10_file)
660     {
661       default_player.level_nr = fgetc(file);
662       for(i=0;i<10;i++)         /* currently unused bytes */
663         fgetc(file);
664     }
665     else
666       default_player.level_nr = default_player.handicap;
667
668     if (feof(file))             /* Spieler noch nicht in Liste enthalten */
669       break;
670     else                        /* prüfen, ob Spieler in Liste enthalten */
671       if (!strncmp(default_player.login_name,
672                    local_player->login_name, MAX_NAMELEN-1))
673       {
674         fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
675         break;
676       }
677   }
678
679   local_player->level_nr = level_nr;
680
681   for(i=0;i<MAX_NAMELEN;i++)
682     fputc(local_player->login_name[i],file);
683   for(i=0;i<MAX_NAMELEN;i++)
684     fputc(local_player->alias_name[i],file);
685   fputc(local_player->handicap,file);
686   fputc(local_player->setup / 256,file);
687   fputc(local_player->setup % 256,file);
688   fputc(local_player->leveldir_nr,file);
689   if (!version_10_file)
690   {
691     fputc(local_player->level_nr,file);
692     for(i=0;i<10;i++)           /* currently unused bytes */
693       fputc(0,file);
694   }
695
696   fclose(file);
697 }
698
699 void LoadJoystickData()
700 {
701   int i;
702   char cookie[256];
703   FILE *file;
704
705   if (joystick_status==JOYSTICK_OFF)
706     return;
707
708 #ifndef MSDOS
709   if (!(file=fopen(JOYDAT_FILE,"r")))
710     return;
711
712   fscanf(file,"%s",cookie);
713   if (strcmp(cookie,JOYSTICK_COOKIE))   /* ungültiges Format? */
714   {
715     fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
716     fclose(file);
717     return;
718   }
719
720   for(i=0;i<2;i++)
721   {
722     fscanf(file,"%s",cookie);
723     fscanf(file, "%d %d %d \n",
724            &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
725     fscanf(file, "%d %d %d \n",
726            &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
727   }
728   fclose(file);
729
730   CheckJoystickData();
731 #else
732   load_joystick_data(JOYDAT_FILE);
733 #endif
734 }
735
736 void SaveJoystickData()
737 {
738   int i;
739   FILE *file;
740
741   if (joystick_status==JOYSTICK_OFF)
742     return;
743
744 #ifndef MSDOS
745   CheckJoystickData();
746
747   if (!(file=fopen(JOYDAT_FILE,"w")))
748   {
749     fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
750     return;
751   }
752
753   fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
754   for(i=0;i<2;i++)
755   {
756     fprintf(file,"JOYSTICK_%d_DATA\n",i);
757     fprintf(file, "%d %d %d \n",
758             joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
759     fprintf(file, "%d %d %d \n",
760             joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
761   }
762   fclose(file);
763
764   chmod(JOYDAT_FILE, JOYDAT_PERMS);
765 #else
766   save_joystick_data(JOYDAT_FILE);
767 #endif
768
769 }