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