rnd-19981002-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     Error(ERR_RETURN, "cannot load level info '%s'", filename);
87     return(FALSE);
88   }
89
90   fscanf(file,"%s\n",cookie);
91   if (strcmp(cookie,LEVELDIR_COOKIE))   /* ungültiges Format? */
92   {
93     Error(ERR_RETURN, "wrong format of level info file");
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     Error(ERR_RETURN, "empty level info '%s'", 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     Error(ERR_RETURN, "cannot load level '%s'", 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       Error(ERR_RETURN, "wrong format of level file '%s'", filename);
145       fclose(file);
146       file = NULL;
147     }
148   }
149
150   if (file)
151   {
152     lev_fieldx = level.fieldx = fgetc(file);
153     lev_fieldy = level.fieldy = fgetc(file);
154
155     level.time          = (fgetc(file)<<8) | fgetc(file);
156     level.edelsteine    = (fgetc(file)<<8) | fgetc(file);
157     for(i=0;i<MAX_LEVNAMLEN;i++)
158       level.name[i]     = fgetc(file);
159     level.name[MAX_LEVNAMLEN-1] = 0;
160     for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
161       level.score[i]    = fgetc(file);
162     for(i=0;i<4;i++)
163       for(y=0;y<3;y++)
164         for(x=0;x<3;x++)
165           level.mampfer_inhalt[i][x][y] = fgetc(file);
166     level.tempo_amoebe  = fgetc(file);
167     level.dauer_sieb    = fgetc(file);
168     level.dauer_ablenk  = fgetc(file);
169     level.amoebe_inhalt = fgetc(file);
170
171     for(i=0;i<NUM_FREE_LVHD_BYTES;i++)  /* Rest frei / Headergröße 80 Bytes */
172       fgetc(file);
173
174     for(y=0;y<MAX_LEV_FIELDY;y++) 
175       for(x=0;x<MAX_LEV_FIELDX;x++) 
176         Feld[x][y] = Ur[x][y] = EL_ERDREICH;
177
178     for(y=0;y<lev_fieldy;y++) 
179       for(x=0;x<lev_fieldx;x++) 
180         Feld[x][y] = Ur[x][y] = fgetc(file);
181
182     fclose(file);
183
184     if (level.time<=10) /* Mindestspieldauer */
185       level.time = 10;
186   }
187   else
188   {
189     lev_fieldx = level.fieldx = STD_LEV_FIELDX;
190     lev_fieldy = level.fieldy = STD_LEV_FIELDY;
191
192     level.time          = 100;
193     level.edelsteine    = 0;
194     strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
195     for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
196       level.score[i]    = 10;
197     for(i=0;i<4;i++)
198       for(y=0;y<3;y++)
199         for(x=0;x<3;x++)
200           level.mampfer_inhalt[i][x][y] = EL_FELSBROCKEN;
201     level.tempo_amoebe  = 10;
202     level.dauer_sieb    = 10;
203     level.dauer_ablenk  = 10;
204     level.amoebe_inhalt = EL_DIAMANT;
205
206     for(y=0;y<STD_LEV_FIELDY;y++) 
207       for(x=0;x<STD_LEV_FIELDX;x++) 
208         Feld[x][y] = Ur[x][y] = EL_ERDREICH;
209     Feld[0][0] = Ur[0][0] = EL_SPIELFIGUR;
210     Feld[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
211       Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_AUSGANG_ZU;
212   }
213 }
214
215 void LoadLevelTape(int level_nr)
216 {
217   int i;
218   char filename[MAX_FILENAME];
219   char cookie[MAX_FILENAME];
220   FILE *file;
221   BOOL levelrec_10 = FALSE;
222
223 #ifndef MSDOS
224   sprintf(filename,"%s/%s/%d.tape",
225           level_directory,leveldir[leveldir_nr].filename,level_nr);
226 #else
227   sprintf(filename,"%s/%s/%d.tap",
228           level_directory,leveldir[leveldir_nr].filename,level_nr);
229 #endif
230
231   if ((file=fopen(filename,"r")))
232   {
233     fgets(cookie,LEVELREC_COOKIE_LEN,file);
234     fgetc(file);
235     if (!strcmp(cookie,LEVELREC_COOKIE_10))     /* old 1.0 tape format */
236       levelrec_10 = TRUE;
237     else if (strcmp(cookie,LEVELREC_COOKIE))    /* unknown tape format */
238     {
239       Error(ERR_RETURN, "wrong format of level recording file '%s'", 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     int j;
266
267     if (i >= MAX_TAPELEN)
268       break;
269
270     for(j=0; j<MAX_PLAYERS; j++)
271     {
272       if (levelrec_10 && j>0)
273       {
274         tape.pos[i].joystickdata[j] = MV_NO_MOVING;
275         continue;
276       }
277       tape.pos[i].joystickdata[j] = fgetc(file);
278     }
279
280     tape.pos[i].delay = fgetc(file);
281
282     if (feof(file))
283       break;
284   }
285
286   fclose(file);
287
288   if (i != tape.length)
289     Error(ERR_RETURN, "level recording file '%s' corrupted", filename);
290
291   tape.length_seconds = GetTapeLength();
292 }
293
294 void LoadScore(int level_nr)
295 {
296   int i,j;
297   char filename[MAX_FILENAME];
298   char cookie[MAX_FILENAME];
299   FILE *file;
300
301   sprintf(filename,"%s/%s/%s",
302           level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
303
304   if (!(file = fopen(filename,"r")))
305   {
306     if (!CreateNewScoreFile())
307       Error(ERR_RETURN, "cannot create score file '%s'", filename);
308     else if (!(file = fopen(filename,"r"))) 
309       Error(ERR_RETURN, "cannot load score for level %d", level_nr);
310   }
311
312   if (file)
313   {
314     fgets(cookie,SCORE_COOKIE_LEN,file);
315     if (strcmp(cookie,SCORE_COOKIE))    /* ungültiges Format? */
316     {
317       Error(ERR_RETURN, "wrong format of score file '%s'", filename);
318       fclose(file);
319       file = NULL;
320     }
321   }
322
323   if (file)
324   {
325     fseek(file,
326           SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
327           SEEK_SET);
328     for(i=0;i<MAX_SCORE_ENTRIES;i++)
329     {
330       for(j=0;j<MAX_NAMELEN;j++)
331         highscore[i].Name[j] = fgetc(file);
332       highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
333     }
334     fclose(file);
335   }
336   else
337   {
338     for(i=0;i<MAX_SCORE_ENTRIES;i++)
339     {
340       strcpy(highscore[i].Name,EMPTY_ALIAS);
341       highscore[i].Score = 0;
342     }
343   }
344 }
345
346 void LoadPlayerInfo(int mode)
347 {
348   int i;
349   char filename[MAX_FILENAME];
350   char cookie[MAX_FILENAME];
351   FILE *file;
352   char *login_name = GetLoginName();
353   struct PlayerInfo default_player, new_player;
354   int version_10_file = FALSE;
355
356   if (mode==PLAYER_LEVEL)
357     sprintf(filename,"%s/%s/%s",
358             level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
359   else
360     sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
361
362   for(i=0;i<MAX_NAMELEN;i++)
363     default_player.login_name[i] = default_player.alias_name[i] = 0;
364   strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
365   strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
366   default_player.handicap = 0;
367   default_player.setup = DEFAULT_SETUP;
368   default_player.leveldir_nr = 0;
369   default_player.level_nr = 0;
370
371   new_player = default_player;
372
373   if (!(file = fopen(filename,"r")))
374   {
375     if (!CreateNewNamesFile(mode))
376       Error(ERR_RETURN, "cannot create names file '%s'", filename);
377     else if (!(file = fopen(filename,"r"))) 
378       Error(ERR_RETURN, "cannot load player information file '%s'", filename);
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       Error(ERR_RETURN, "wrong format of names file '%s'", filename);
389       fclose(file);
390       file = NULL;
391     }
392   }
393
394   if (!file)
395   {
396     *local_player = default_player;
397     level_nr = default_player.level_nr;
398     return;
399   }
400
401   while(1)
402   {
403     for(i=0;i<MAX_NAMELEN;i++)
404       new_player.login_name[i] = fgetc(file);
405     for(i=0;i<MAX_NAMELEN;i++)
406       new_player.alias_name[i] = fgetc(file);
407     new_player.handicap = fgetc(file);
408     new_player.setup = (fgetc(file)<<8) | fgetc(file);
409     new_player.leveldir_nr = fgetc(file);
410     if (!version_10_file)
411     {
412       new_player.level_nr = fgetc(file);
413       for(i=0;i<10;i++)         /* currently unused bytes */
414         fgetc(file);
415     }
416     else
417       new_player.level_nr = new_player.handicap;
418
419     if (feof(file))             /* Spieler noch nicht in Liste enthalten */
420     {
421       new_player = default_player;
422
423       fclose(file);
424       if (!(file = fopen(filename,"a")))
425         Error(ERR_RETURN, "cannot append new player to names file '%s'",
426               filename);
427       else
428       {
429         for(i=0;i<MAX_NAMELEN;i++)
430           fputc(new_player.login_name[i],file);
431         for(i=0;i<MAX_NAMELEN;i++)
432           fputc(new_player.alias_name[i],file);
433         fputc(new_player.handicap,file);
434         fputc(new_player.setup / 256,file);
435         fputc(new_player.setup % 256,file);
436         fputc(new_player.leveldir_nr,file);
437         if (!version_10_file)
438         {
439           fputc(new_player.level_nr,file);
440           for(i=0;i<10;i++)     /* currently unused bytes */
441             fputc(0,file);
442         }
443       }
444       break;
445     }
446     else                        /* prüfen, ob Spieler in Liste enthalten */
447       if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
448         break;
449   }
450
451   if (mode==PLAYER_SETUP)
452   {
453     *local_player = new_player;
454     if (local_player->leveldir_nr < num_leveldirs)
455       leveldir_nr = local_player->leveldir_nr;
456     else
457       leveldir_nr = 0;
458   }
459   else
460   {
461     local_player->handicap = new_player.handicap;
462     local_player->level_nr = new_player.level_nr;
463   }
464
465   level_nr = local_player->level_nr;
466   fclose(file);
467 }
468
469 void SaveLevel(int level_nr)
470 {
471   int i,x,y;
472   char filename[MAX_FILENAME];
473   FILE *file;
474
475   sprintf(filename,"%s/%s/%d",
476           level_directory,leveldir[leveldir_nr].filename,level_nr);
477
478   if (!(file=fopen(filename,"w")))
479   {
480     Error(ERR_RETURN, "cannot save level file '%s'", filename);
481     return;
482   }
483
484   fputs(LEVEL_COOKIE,file);             /* Formatkennung */
485   fputc(0x0a,file);
486
487   fputc(level.fieldx,file);
488   fputc(level.fieldy,file);
489   fputc(level.time / 256,file);
490   fputc(level.time % 256,file);
491   fputc(level.edelsteine / 256,file);
492   fputc(level.edelsteine % 256,file);
493
494   for(i=0;i<MAX_LEVNAMLEN;i++)
495     fputc(level.name[i],file);
496   for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
497     fputc(level.score[i],file);
498   for(i=0;i<4;i++)
499     for(y=0;y<3;y++)
500       for(x=0;x<3;x++)
501         fputc(level.mampfer_inhalt[i][x][y],file);
502   fputc(level.tempo_amoebe,file);
503   fputc(level.dauer_sieb,file);
504   fputc(level.dauer_ablenk,file);
505   fputc(level.amoebe_inhalt,file);
506
507   for(i=0;i<NUM_FREE_LVHD_BYTES;i++)    /* Rest frei / Headergröße 80 Bytes */
508     fputc(0,file);
509
510   for(y=0;y<lev_fieldy;y++) 
511     for(x=0;x<lev_fieldx;x++) 
512       fputc(Ur[x][y],file);
513
514   fclose(file);
515
516   chmod(filename, LEVEL_PERMS);
517 }
518
519 void SaveLevelTape(int level_nr)
520 {
521   int i;
522   char filename[MAX_FILENAME];
523   FILE *file;
524   BOOL new_tape = TRUE;
525
526 #ifndef MSDOS
527   sprintf(filename,"%s/%s/%d.tape",
528           level_directory,leveldir[leveldir_nr].filename,level_nr);
529 #else
530   sprintf(filename,"%s/%s/%d.tap",
531           level_directory,leveldir[leveldir_nr].filename,level_nr);
532 #endif
533
534   /* Testen, ob bereits eine Aufnahme existiert */
535   if ((file=fopen(filename,"r")))
536   {
537     new_tape = FALSE;
538     fclose(file);
539
540     if (!AreYouSure("Replace old tape ?",AYS_ASK))
541       return;
542   }
543
544   if (!(file=fopen(filename,"w")))
545   {
546     Error(ERR_RETURN, "cannot save level recording file '%s'", filename);
547     return;
548   }
549
550   fputs(LEVELREC_COOKIE,file);          /* Formatkennung */
551   fputc(0x0a,file);
552
553   fputc((tape.random_seed >> 24) & 0xff,file);
554   fputc((tape.random_seed >> 16) & 0xff,file);
555   fputc((tape.random_seed >>  8) & 0xff,file);
556   fputc((tape.random_seed >>  0) & 0xff,file);
557
558   fputc((tape.date >>  24) & 0xff,file);
559   fputc((tape.date >>  16) & 0xff,file);
560   fputc((tape.date >>   8) & 0xff,file);
561   fputc((tape.date >>   0) & 0xff,file);
562
563   fputc((tape.length >>  24) & 0xff,file);
564   fputc((tape.length >>  16) & 0xff,file);
565   fputc((tape.length >>   8) & 0xff,file);
566   fputc((tape.length >>   0) & 0xff,file);
567
568   for(i=0;i<tape.length;i++)
569   {
570     int j;
571
572     for(j=0; j<MAX_PLAYERS; j++)
573       fputc(tape.pos[i].joystickdata[j],file);
574
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     Error(ERR_RETURN, "cannot save score for level %d", level_nr);
600     return;
601   }
602
603   fseek(file,
604         SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
605         SEEK_SET);
606   for(i=0;i<MAX_SCORE_ENTRIES;i++)
607   {
608     for(j=0;j<MAX_NAMELEN;j++)
609       fputc(highscore[i].Name[j],file);
610     fputc(highscore[i].Score / 256,file);
611     fputc(highscore[i].Score % 256,file);
612   }
613   fclose(file);
614 }
615
616 void SavePlayerInfo(int mode)
617 {
618   int i;
619   char filename[MAX_FILENAME];
620   char cookie[MAX_FILENAME];
621   FILE *file;
622   struct PlayerInfo default_player;
623   int version_10_file = FALSE;
624
625   if (mode==PLAYER_LEVEL)
626     sprintf(filename,"%s/%s/%s",
627             level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
628   else
629     sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
630
631   if (!(file = fopen(filename,"r+")))
632   {
633     Error(ERR_RETURN, "cannot save player information to file '%s'", filename);
634     return;
635   }
636
637   fgets(cookie,NAMES_COOKIE_LEN,file);
638   if (!strcmp(cookie,NAMES_COOKIE_10))  /* altes Format? */
639     version_10_file = TRUE;
640   else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
641   {
642     Error(ERR_RETURN, "wrong format of names file '%s'", filename);
643     fclose(file);
644     return;
645   }
646
647   while(1)
648   {
649     for(i=0;i<MAX_NAMELEN;i++)
650       default_player.login_name[i] = fgetc(file);
651     for(i=0;i<MAX_NAMELEN;i++)
652       default_player.alias_name[i] = fgetc(file);
653     default_player.handicap = fgetc(file);
654     default_player.setup = (fgetc(file)<<8) | fgetc(file);
655     default_player.leveldir_nr = fgetc(file);
656     if (!version_10_file)
657     {
658       default_player.level_nr = fgetc(file);
659       for(i=0;i<10;i++)         /* currently unused bytes */
660         fgetc(file);
661     }
662     else
663       default_player.level_nr = default_player.handicap;
664
665     if (feof(file))             /* Spieler noch nicht in Liste enthalten */
666       break;
667     else                        /* prüfen, ob Spieler in Liste enthalten */
668       if (!strncmp(default_player.login_name,
669                    local_player->login_name, MAX_NAMELEN-1))
670       {
671         fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
672         break;
673       }
674   }
675
676   local_player->level_nr = level_nr;
677
678   for(i=0;i<MAX_NAMELEN;i++)
679     fputc(local_player->login_name[i],file);
680   for(i=0;i<MAX_NAMELEN;i++)
681     fputc(local_player->alias_name[i],file);
682   fputc(local_player->handicap,file);
683   fputc(local_player->setup / 256,file);
684   fputc(local_player->setup % 256,file);
685   fputc(local_player->leveldir_nr,file);
686   if (!version_10_file)
687   {
688     fputc(local_player->level_nr,file);
689     for(i=0;i<10;i++)           /* currently unused bytes */
690       fputc(0,file);
691   }
692
693   fclose(file);
694 }
695
696 void LoadJoystickData()
697 {
698   int i;
699   char cookie[256];
700   FILE *file;
701
702   if (joystick_status==JOYSTICK_OFF)
703     return;
704
705 #ifndef MSDOS
706   if (!(file=fopen(JOYDAT_FILE,"r")))
707     return;
708
709   fscanf(file,"%s",cookie);
710   if (strcmp(cookie,JOYSTICK_COOKIE))   /* ungültiges Format? */
711   {
712     Error(ERR_RETURN, "wrong format of joystick file '%s'", JOYDAT_FILE);
713     fclose(file);
714     return;
715   }
716
717   for(i=0;i<2;i++)
718   {
719     fscanf(file,"%s",cookie);
720     fscanf(file, "%d %d %d \n",
721            &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
722     fscanf(file, "%d %d %d \n",
723            &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
724   }
725   fclose(file);
726
727   CheckJoystickData();
728 #else
729   load_joystick_data(JOYDAT_FILE);
730 #endif
731 }
732
733 void SaveJoystickData()
734 {
735   int i;
736   FILE *file;
737
738   if (joystick_status==JOYSTICK_OFF)
739     return;
740
741 #ifndef MSDOS
742   CheckJoystickData();
743
744   if (!(file=fopen(JOYDAT_FILE,"w")))
745   {
746     Error(ERR_RETURN, "cannot save joystick calibration data to file '%s'",
747           JOYDAT_FILE);
748     return;
749   }
750
751   fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
752   for(i=0;i<2;i++)
753   {
754     fprintf(file,"JOYSTICK_%d_DATA\n",i);
755     fprintf(file, "%d %d %d \n",
756             joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
757     fprintf(file, "%d %d %d \n",
758             joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
759   }
760   fclose(file);
761
762   chmod(JOYDAT_FILE, JOYDAT_PERMS);
763 #else
764   save_joystick_data(JOYDAT_FILE);
765 #endif
766
767 }