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