rocks_n_diamonds-1.0
[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
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
223   sprintf(filename,"%s/%s/%d.tape",
224           level_directory,leveldir[leveldir_nr].filename,level_nr);
225
226   if ((file=fopen(filename,"r")))
227   {
228     fgets(cookie,LEVELREC_COOKIE_LEN,file);
229     fgetc(file);
230     if (strcmp(cookie,LEVELREC_COOKIE)) /* ungültiges Format? */
231     {
232       fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
233               progname,filename);
234       fclose(file);
235       file = NULL;
236     }
237   }
238
239   if (!file)
240     return;
241
242   tape.random_seed =
243     (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
244   tape.date =
245     (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
246   tape.length =
247     (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
248
249   tape.level_nr = level_nr;
250   tape.counter = 0;
251   tape.changed = FALSE;
252
253   tape.recording = FALSE;
254   tape.playing = FALSE;
255   tape.pausing = FALSE;
256
257   for(i=0;i<tape.length;i++)
258   {
259     if (i>=MAX_TAPELEN)
260       break;
261     tape.pos[i].joystickdata = fgetc(file);
262     tape.pos[i].delay        = fgetc(file);
263     if (feof(file))
264       break;
265   }
266
267   fclose(file);
268
269   if (i != tape.length)
270     fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
271             progname,filename);
272
273   tape.length_seconds = GetTapeLength();
274 }
275
276 void LoadScore(int level_nr)
277 {
278   int i,j;
279   char filename[MAX_FILENAME];
280   char cookie[MAX_FILENAME];
281   FILE *file;
282
283   sprintf(filename,"%s/%s/%s",
284           level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
285
286   if (!(file=fopen(filename,"r")))
287   {
288     if (!CreateNewScoreFile())
289     {
290       fprintf(stderr,"%s: cannot create score file '%s'!\n",
291               progname,filename);
292     }
293     else if (!(file=fopen(filename,"r"))) 
294     {
295       fprintf(stderr,"%s: cannot load score for level %d!\n",
296               progname,level_nr);
297     }
298   }
299
300   if (file)
301   {
302     fgets(cookie,SCORE_COOKIE_LEN,file);
303     if (strcmp(cookie,SCORE_COOKIE))    /* ungültiges Format? */
304     {
305       fprintf(stderr,"%s: wrong format of score file!\n",progname);
306       fclose(file);
307       file = NULL;
308     }
309   }
310
311   if (file)
312   {
313     fseek(file,
314           SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
315           SEEK_SET);
316     for(i=0;i<MAX_SCORE_ENTRIES;i++)
317     {
318       for(j=0;j<MAX_NAMELEN;j++)
319         highscore[i].Name[j] = fgetc(file);
320       highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
321     }
322     fclose(file);
323   }
324   else
325   {
326     for(i=0;i<MAX_SCORE_ENTRIES;i++)
327     {
328       strcpy(highscore[i].Name,EMPTY_ALIAS);
329       highscore[i].Score = 0;
330     }
331   }
332 }
333
334 void LoadPlayerInfo(int mode)
335 {
336   int i;
337   char filename[MAX_FILENAME];
338   char cookie[MAX_FILENAME];
339   FILE *file;
340   char *login_name = GetLoginName();
341   struct PlayerInfo default_player, new_player;
342   int version_10_file = FALSE;
343
344   if (mode==PLAYER_LEVEL)
345     sprintf(filename,"%s/%s/%s",
346             level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
347   else
348     sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
349
350   for(i=0;i<MAX_NAMELEN;i++)
351     default_player.login_name[i] = default_player.alias_name[i] = 0;
352   strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
353   strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
354   default_player.handicap = 0;
355   default_player.setup = DEFAULT_SETUP;
356   default_player.leveldir_nr = 0;
357   default_player.level_nr = 0;
358
359   new_player = default_player;
360
361   if (!(file=fopen(filename,"r")))
362   {
363     if (!CreateNewNamesFile(mode))
364     {
365       fprintf(stderr,"%s: cannot create names file '%s'!\n",
366               progname,filename);
367     }
368     else if (!(file=fopen(filename,"r"))) 
369     {
370       fprintf(stderr,"%s: cannot load player information '%s'!\n",
371               progname,filename);
372     }
373   }
374
375   if (file)
376   {
377     fgets(cookie,NAMES_COOKIE_LEN,file);
378     if (!strcmp(cookie,NAMES_COOKIE_10))        /* altes Format? */
379       version_10_file = TRUE;
380     else if (strcmp(cookie,NAMES_COOKIE))       /* ungültiges Format? */
381     {
382       fprintf(stderr,"%s: wrong format of names file '%s'!\n",
383               progname,filename);
384       fclose(file);
385       file = NULL;
386     }
387   }
388
389   if (!file)
390   {
391     player = default_player;
392     level_nr = default_player.level_nr;
393     return;
394   }
395
396   while(1)
397   {
398     for(i=0;i<MAX_NAMELEN;i++)
399       new_player.login_name[i] = fgetc(file);
400     for(i=0;i<MAX_NAMELEN;i++)
401       new_player.alias_name[i] = fgetc(file);
402     new_player.handicap = fgetc(file);
403     new_player.setup = (fgetc(file)<<8) | fgetc(file);
404     new_player.leveldir_nr = fgetc(file);
405     if (!version_10_file)
406     {
407       new_player.level_nr = fgetc(file);
408       for(i=0;i<10;i++)         /* currently unused bytes */
409         fgetc(file);
410     }
411     else
412       new_player.level_nr = new_player.handicap;
413
414     if (feof(file))             /* Spieler noch nicht in Liste enthalten */
415     {
416       new_player = default_player;
417
418       fclose(file);
419       if (!(file=fopen(filename,"a")))
420       {
421         fprintf(stderr,"%s: cannot append new player to names file '%s'!\n",
422                 progname,filename);
423       }
424       else
425       {
426         for(i=0;i<MAX_NAMELEN;i++)
427           fputc(new_player.login_name[i],file);
428         for(i=0;i<MAX_NAMELEN;i++)
429           fputc(new_player.alias_name[i],file);
430         fputc(new_player.handicap,file);
431         fputc(new_player.setup / 256,file);
432         fputc(new_player.setup % 256,file);
433         fputc(new_player.leveldir_nr,file);
434         if (!version_10_file)
435         {
436           fputc(new_player.level_nr,file);
437           for(i=0;i<10;i++)     /* currently unused bytes */
438             fputc(0,file);
439         }
440       }
441       break;
442     }
443     else                        /* prüfen, ob Spieler in Liste enthalten */
444       if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
445         break;
446   }
447
448   if (mode==PLAYER_SETUP)
449   {
450     player = new_player;
451     if (player.leveldir_nr < num_leveldirs)
452       leveldir_nr = player.leveldir_nr;
453     else
454       leveldir_nr = 0;
455   }
456   else
457   {
458     player.handicap = new_player.handicap;
459     player.level_nr = new_player.level_nr;
460   }
461
462   level_nr = player.level_nr;
463   fclose(file);
464 }
465
466 void SaveLevel(int level_nr)
467 {
468   int i,x,y;
469   char filename[MAX_FILENAME];
470   FILE *file;
471
472   sprintf(filename,"%s/%s/%d",
473           level_directory,leveldir[leveldir_nr].filename,level_nr);
474
475   if (!(file=fopen(filename,"w")))
476   {
477     fprintf(stderr,"%s: cannot save level file '%s'!\n",progname,filename);
478     return;
479   }
480
481   fputs(LEVEL_COOKIE,file);             /* Formatkennung */
482   fputc(0x0a,file);
483
484   fputc(level.fieldx,file);
485   fputc(level.fieldy,file);
486   fputc(level.time / 256,file);
487   fputc(level.time % 256,file);
488   fputc(level.edelsteine / 256,file);
489   fputc(level.edelsteine % 256,file);
490
491   for(i=0;i<MAX_LEVNAMLEN;i++)
492     fputc(level.name[i],file);
493   for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
494     fputc(level.score[i],file);
495   for(i=0;i<4;i++)
496     for(y=0;y<3;y++)
497       for(x=0;x<3;x++)
498         fputc(level.mampfer_inhalt[i][x][y],file);
499   fputc(level.tempo_amoebe,file);
500   fputc(level.dauer_sieb,file);
501   fputc(level.dauer_ablenk,file);
502   fputc(level.amoebe_inhalt,file);
503
504   for(i=0;i<NUM_FREE_LVHD_BYTES;i++)    /* Rest frei / Headergröße 80 Bytes */
505     fputc(0,file);
506
507   for(y=0;y<lev_fieldy;y++) 
508     for(x=0;x<lev_fieldx;x++) 
509       fputc(Ur[x][y],file);
510
511   fclose(file);
512
513   chmod(filename, LEVEL_PERMS);
514 }
515
516 void SaveLevelTape(int level_nr)
517 {
518   int i;
519   char filename[MAX_FILENAME];
520   FILE *file;
521   BOOL new_tape = TRUE;
522
523   sprintf(filename,"%s/%s/%d.tape",
524           level_directory,leveldir[leveldir_nr].filename,level_nr);
525
526   /* Testen, ob bereits eine Aufnahme existiert */
527   if ((file=fopen(filename,"r")))
528   {
529     new_tape = FALSE;
530     fclose(file);
531
532     if (!AreYouSure("Replace old tape ?",AYS_ASK))
533       return;
534   }
535
536   if (!(file=fopen(filename,"w")))
537   {
538     fprintf(stderr,"%s: cannot save level recording file '%s'!\n",
539             progname,filename);
540     return;
541   }
542
543   fputs(LEVELREC_COOKIE,file);          /* Formatkennung */
544   fputc(0x0a,file);
545
546   fputc((tape.random_seed >> 24) & 0xff,file);
547   fputc((tape.random_seed >> 16) & 0xff,file);
548   fputc((tape.random_seed >>  8) & 0xff,file);
549   fputc((tape.random_seed >>  0) & 0xff,file);
550
551   fputc((tape.date >>  24) & 0xff,file);
552   fputc((tape.date >>  16) & 0xff,file);
553   fputc((tape.date >>   8) & 0xff,file);
554   fputc((tape.date >>   0) & 0xff,file);
555
556   fputc((tape.length >>  24) & 0xff,file);
557   fputc((tape.length >>  16) & 0xff,file);
558   fputc((tape.length >>   8) & 0xff,file);
559   fputc((tape.length >>   0) & 0xff,file);
560
561   for(i=0;i<tape.length;i++)
562   {
563     fputc(tape.pos[i].joystickdata,file);
564     fputc(tape.pos[i].delay,file);
565   }
566
567   fclose(file);
568
569   chmod(filename, LEVREC_PERMS);
570
571   tape.changed = FALSE;
572
573   if (new_tape)
574     AreYouSure("tape saved !",AYS_CONFIRM);
575 }
576
577 void SaveScore(int level_nr)
578 {
579   int i,j;
580   char filename[MAX_FILENAME];
581   FILE *file;
582
583   sprintf(filename,"%s/%s/%s",
584           level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
585
586   if (!(file=fopen(filename,"r+")))
587   {
588     fprintf(stderr,"%s: cannot save score for level %d!\n",
589             progname,level_nr);
590     return;
591   }
592
593   fseek(file,
594         SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
595         SEEK_SET);
596   for(i=0;i<MAX_SCORE_ENTRIES;i++)
597   {
598     for(j=0;j<MAX_NAMELEN;j++)
599       fputc(highscore[i].Name[j],file);
600     fputc(highscore[i].Score / 256,file);
601     fputc(highscore[i].Score % 256,file);
602   }
603   fclose(file);
604 }
605
606 void SavePlayerInfo(int mode)
607 {
608   int i;
609   char filename[MAX_FILENAME];
610   char cookie[MAX_FILENAME];
611   FILE *file;
612   struct PlayerInfo default_player;
613   int version_10_file = FALSE;
614
615   if (mode==PLAYER_LEVEL)
616     sprintf(filename,"%s/%s/%s",
617             level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
618   else
619     sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
620
621   if (!(file=fopen(filename,"r+")))
622   {
623     fprintf(stderr,"%s: cannot save player information '%s'!\n",
624             progname,filename);
625     return;
626   }
627
628   fgets(cookie,NAMES_COOKIE_LEN,file);
629   if (!strcmp(cookie,NAMES_COOKIE_10))  /* altes Format? */
630     version_10_file = TRUE;
631   else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
632   {
633     fprintf(stderr,"%s: wrong format of names file '%s'!\n",
634             progname,filename);
635     fclose(file);
636     return;
637   }
638
639   while(1)
640   {
641     for(i=0;i<MAX_NAMELEN;i++)
642       default_player.login_name[i] = fgetc(file);
643     for(i=0;i<MAX_NAMELEN;i++)
644       default_player.alias_name[i] = fgetc(file);
645     default_player.handicap = fgetc(file);
646     default_player.setup = (fgetc(file)<<8) | fgetc(file);
647     default_player.leveldir_nr = fgetc(file);
648     if (!version_10_file)
649     {
650       default_player.level_nr = fgetc(file);
651       for(i=0;i<10;i++)         /* currently unused bytes */
652         fgetc(file);
653     }
654     else
655       default_player.level_nr = default_player.handicap;
656
657     if (feof(file))             /* Spieler noch nicht in Liste enthalten */
658       break;
659     else                        /* prüfen, ob Spieler in Liste enthalten */
660       if (!strncmp(default_player.login_name,player.login_name,MAX_NAMELEN-1))
661       {
662         fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
663         break;
664       }
665   }
666
667   player.level_nr = level_nr;
668
669   for(i=0;i<MAX_NAMELEN;i++)
670     fputc(player.login_name[i],file);
671   for(i=0;i<MAX_NAMELEN;i++)
672     fputc(player.alias_name[i],file);
673   fputc(player.handicap,file);
674   fputc(player.setup / 256,file);
675   fputc(player.setup % 256,file);
676   fputc(player.leveldir_nr,file);
677   if (!version_10_file)
678   {
679     fputc(player.level_nr,file);
680     for(i=0;i<10;i++)           /* currently unused bytes */
681       fputc(0,file);
682   }
683
684   fclose(file);
685 }
686
687 void LoadJoystickData()
688 {
689   int i;
690   char cookie[256];
691   FILE *file;
692
693   if (joystick_status==JOYSTICK_OFF)
694     return;
695
696   if (!(file=fopen(JOYDAT_FILE,"r")))
697     return;
698
699   fscanf(file,"%s",cookie);
700   if (strcmp(cookie,JOYSTICK_COOKIE))   /* ungültiges Format? */
701   {
702     fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
703     fclose(file);
704     return;
705   }
706
707   for(i=0;i<2;i++)
708   {
709     fscanf(file,"%s",cookie);
710     fscanf(file, "%d %d %d \n",
711            &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
712     fscanf(file, "%d %d %d \n",
713            &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
714   }
715   fclose(file);
716
717   CheckJoystickData();
718 }
719
720 void SaveJoystickData()
721 {
722   int i;
723   FILE *file;
724
725   if (joystick_status==JOYSTICK_OFF)
726     return;
727
728   CheckJoystickData();
729
730   if (!(file=fopen(JOYDAT_FILE,"w")))
731   {
732     fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
733     return;
734   }
735
736   fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
737   for(i=0;i<2;i++)
738   {
739     fprintf(file,"JOYSTICK_%d_DATA\n",i);
740     fprintf(file, "%d %d %d \n",
741             joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
742     fprintf(file, "%d %d %d \n",
743             joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
744   }
745   fclose(file);
746
747   chmod(JOYDAT_FILE, JOYDAT_PERMS);
748 }