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