1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back! *
3 *----------------------------------------------------------*
4 * ©1995 Artsoft Development *
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 *----------------------------------------------------------*
13 ***********************************************************/
21 BOOL CreateNewScoreFile()
24 char filename[MAX_FILENAME];
25 char empty_alias[MAX_NAMELEN];
28 sprintf(filename,"%s/%s/%s",
29 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
31 if (!(file=fopen(filename,"w")))
34 for(i=0;i<MAX_NAMELEN;i++)
36 strncpy(empty_alias,EMPTY_ALIAS,MAX_NAMELEN-1);
38 fputs(SCORE_COOKIE,file); /* Formatkennung */
39 for(i=0;i<leveldir[leveldir_nr].levels;i++)
41 for(j=0;j<MAX_SCORE_ENTRIES;j++)
43 for(k=0;k<MAX_NAMELEN;k++)
44 fputc(empty_alias[k],file);
51 chmod(filename, SCORE_PERMS);
55 BOOL CreateNewNamesFile(int mode)
57 char filename[MAX_FILENAME];
60 if (mode==PLAYER_LEVEL)
61 sprintf(filename,"%s/%s/%s",
62 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
64 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
66 if (!(file=fopen(filename,"w")))
69 fputs(NAMES_COOKIE,file); /* Formatkennung */
72 chmod(filename, NAMES_PERMS);
79 char filename[MAX_FILENAME];
80 char cookie[MAX_FILENAME];
83 sprintf(filename,"%s/%s",level_directory,LEVDIR_FILENAME);
85 if (!(file=fopen(filename,"r")))
87 fprintf(stderr,"%s: cannot load level info '%s'!\n",progname,filename);
91 fscanf(file,"%s\n",cookie);
92 if (strcmp(cookie,LEVELDIR_COOKIE)) /* ungültiges Format? */
94 fprintf(stderr,"%s: wrong format of level info file!\n",progname);
101 for(i=0;i<MAX_LEVDIR_ENTRIES;i++)
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);
115 fprintf(stderr,"%s: empty level info '%s'!\n",progname,filename);
122 void LoadLevel(int level_nr)
125 char filename[MAX_FILENAME];
126 char cookie[MAX_FILENAME];
129 sprintf(filename,"%s/%s/%d",
130 level_directory,leveldir[leveldir_nr].filename,level_nr);
132 if (!(file=fopen(filename,"r")))
135 fprintf(stderr,"%s: cannot load level '%s'!\n",progname,filename);
140 fgets(cookie,LEVEL_COOKIE_LEN,file);
143 if (strcmp(cookie,LEVEL_COOKIE)) /* ungültiges Format? */
145 fprintf(stderr,"%s: wrong format of level file '%s'!\n",
154 lev_fieldx = level.fieldx = fgetc(file);
155 lev_fieldy = level.fieldy = fgetc(file);
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);
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);
173 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
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;
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);
186 if (level.time<=10) /* Mindestspieldauer */
191 lev_fieldx = level.fieldx = STD_LEV_FIELDX;
192 lev_fieldy = level.fieldy = STD_LEV_FIELDY;
195 level.edelsteine = 0;
196 strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
197 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
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;
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;
217 void LoadLevelTape(int level_nr)
220 char filename[MAX_FILENAME];
221 char cookie[MAX_FILENAME];
225 sprintf(filename,"%s/%s/%d.tape",
226 level_directory,leveldir[leveldir_nr].filename,level_nr);
228 sprintf(filename,"%s/%s/%d.tap",
229 level_directory,leveldir[leveldir_nr].filename,level_nr);
232 if ((file=fopen(filename,"r")))
234 fgets(cookie,LEVELREC_COOKIE_LEN,file);
236 if (strcmp(cookie,LEVELREC_COOKIE)) /* ungültiges Format? */
238 fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
249 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
251 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
253 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
255 tape.level_nr = level_nr;
257 tape.changed = FALSE;
259 tape.recording = FALSE;
260 tape.playing = FALSE;
261 tape.pausing = FALSE;
263 for(i=0;i<tape.length;i++)
267 tape.pos[i].joystickdata = fgetc(file);
268 tape.pos[i].delay = fgetc(file);
275 if (i != tape.length)
276 fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
279 tape.length_seconds = GetTapeLength();
282 void LoadScore(int level_nr)
285 char filename[MAX_FILENAME];
286 char cookie[MAX_FILENAME];
289 sprintf(filename,"%s/%s/%s",
290 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
292 if (!(file=fopen(filename,"r")))
294 if (!CreateNewScoreFile())
296 fprintf(stderr,"%s: cannot create score file '%s'!\n",
299 else if (!(file=fopen(filename,"r")))
301 fprintf(stderr,"%s: cannot load score for level %d!\n",
308 fgets(cookie,SCORE_COOKIE_LEN,file);
309 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
311 fprintf(stderr,"%s: wrong format of score file!\n",progname);
320 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
322 for(i=0;i<MAX_SCORE_ENTRIES;i++)
324 for(j=0;j<MAX_NAMELEN;j++)
325 highscore[i].Name[j] = fgetc(file);
326 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
332 for(i=0;i<MAX_SCORE_ENTRIES;i++)
334 strcpy(highscore[i].Name,EMPTY_ALIAS);
335 highscore[i].Score = 0;
340 void LoadPlayerInfo(int mode)
343 char filename[MAX_FILENAME];
344 char cookie[MAX_FILENAME];
346 char *login_name = GetLoginName();
347 struct PlayerInfo default_player, new_player;
348 int version_10_file = FALSE;
350 if (mode==PLAYER_LEVEL)
351 sprintf(filename,"%s/%s/%s",
352 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
354 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
356 for(i=0;i<MAX_NAMELEN;i++)
357 default_player.login_name[i] = default_player.alias_name[i] = 0;
358 strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
359 strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
360 default_player.handicap = 0;
361 default_player.setup = DEFAULT_SETUP;
362 default_player.leveldir_nr = 0;
363 default_player.level_nr = 0;
365 new_player = default_player;
367 if (!(file=fopen(filename,"r")))
369 if (!CreateNewNamesFile(mode))
371 fprintf(stderr,"%s: cannot create names file '%s'!\n",
374 else if (!(file=fopen(filename,"r")))
376 fprintf(stderr,"%s: cannot load player information '%s'!\n",
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? */
388 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
397 player = default_player;
398 level_nr = default_player.level_nr;
404 for(i=0;i<MAX_NAMELEN;i++)
405 new_player.login_name[i] = fgetc(file);
406 for(i=0;i<MAX_NAMELEN;i++)
407 new_player.alias_name[i] = fgetc(file);
408 new_player.handicap = fgetc(file);
409 new_player.setup = (fgetc(file)<<8) | fgetc(file);
410 new_player.leveldir_nr = fgetc(file);
411 if (!version_10_file)
413 new_player.level_nr = fgetc(file);
414 for(i=0;i<10;i++) /* currently unused bytes */
418 new_player.level_nr = new_player.handicap;
420 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
422 new_player = default_player;
425 if (!(file=fopen(filename,"a")))
427 fprintf(stderr,"%s: cannot append new player to names file '%s'!\n",
432 for(i=0;i<MAX_NAMELEN;i++)
433 fputc(new_player.login_name[i],file);
434 for(i=0;i<MAX_NAMELEN;i++)
435 fputc(new_player.alias_name[i],file);
436 fputc(new_player.handicap,file);
437 fputc(new_player.setup / 256,file);
438 fputc(new_player.setup % 256,file);
439 fputc(new_player.leveldir_nr,file);
440 if (!version_10_file)
442 fputc(new_player.level_nr,file);
443 for(i=0;i<10;i++) /* currently unused bytes */
449 else /* prüfen, ob Spieler in Liste enthalten */
450 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
454 if (mode==PLAYER_SETUP)
457 if (player.leveldir_nr < num_leveldirs)
458 leveldir_nr = player.leveldir_nr;
464 player.handicap = new_player.handicap;
465 player.level_nr = new_player.level_nr;
468 level_nr = player.level_nr;
472 void SaveLevel(int level_nr)
475 char filename[MAX_FILENAME];
478 sprintf(filename,"%s/%s/%d",
479 level_directory,leveldir[leveldir_nr].filename,level_nr);
481 if (!(file=fopen(filename,"w")))
483 fprintf(stderr,"%s: cannot save level file '%s'!\n",progname,filename);
487 fputs(LEVEL_COOKIE,file); /* Formatkennung */
490 fputc(level.fieldx,file);
491 fputc(level.fieldy,file);
492 fputc(level.time / 256,file);
493 fputc(level.time % 256,file);
494 fputc(level.edelsteine / 256,file);
495 fputc(level.edelsteine % 256,file);
497 for(i=0;i<MAX_LEVNAMLEN;i++)
498 fputc(level.name[i],file);
499 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
500 fputc(level.score[i],file);
504 fputc(level.mampfer_inhalt[i][x][y],file);
505 fputc(level.tempo_amoebe,file);
506 fputc(level.dauer_sieb,file);
507 fputc(level.dauer_ablenk,file);
508 fputc(level.amoebe_inhalt,file);
510 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
513 for(y=0;y<lev_fieldy;y++)
514 for(x=0;x<lev_fieldx;x++)
515 fputc(Ur[x][y],file);
519 chmod(filename, LEVEL_PERMS);
522 void SaveLevelTape(int level_nr)
525 char filename[MAX_FILENAME];
527 BOOL new_tape = TRUE;
530 sprintf(filename,"%s/%s/%d.tape",
531 level_directory,leveldir[leveldir_nr].filename,level_nr);
533 sprintf(filename,"%s/%s/%d.tap",
534 level_directory,leveldir[leveldir_nr].filename,level_nr);
537 /* Testen, ob bereits eine Aufnahme existiert */
538 if ((file=fopen(filename,"r")))
543 if (!AreYouSure("Replace old tape ?",AYS_ASK))
547 if (!(file=fopen(filename,"w")))
549 fprintf(stderr,"%s: cannot save level recording file '%s'!\n",
554 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
557 fputc((tape.random_seed >> 24) & 0xff,file);
558 fputc((tape.random_seed >> 16) & 0xff,file);
559 fputc((tape.random_seed >> 8) & 0xff,file);
560 fputc((tape.random_seed >> 0) & 0xff,file);
562 fputc((tape.date >> 24) & 0xff,file);
563 fputc((tape.date >> 16) & 0xff,file);
564 fputc((tape.date >> 8) & 0xff,file);
565 fputc((tape.date >> 0) & 0xff,file);
567 fputc((tape.length >> 24) & 0xff,file);
568 fputc((tape.length >> 16) & 0xff,file);
569 fputc((tape.length >> 8) & 0xff,file);
570 fputc((tape.length >> 0) & 0xff,file);
572 for(i=0;i<tape.length;i++)
574 fputc(tape.pos[i].joystickdata,file);
575 fputc(tape.pos[i].delay,file);
580 chmod(filename, LEVREC_PERMS);
582 tape.changed = FALSE;
585 AreYouSure("tape saved !",AYS_CONFIRM);
588 void SaveScore(int level_nr)
591 char filename[MAX_FILENAME];
594 sprintf(filename,"%s/%s/%s",
595 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
597 if (!(file=fopen(filename,"r+")))
599 fprintf(stderr,"%s: cannot save score for level %d!\n",
605 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
607 for(i=0;i<MAX_SCORE_ENTRIES;i++)
609 for(j=0;j<MAX_NAMELEN;j++)
610 fputc(highscore[i].Name[j],file);
611 fputc(highscore[i].Score / 256,file);
612 fputc(highscore[i].Score % 256,file);
617 void SavePlayerInfo(int mode)
620 char filename[MAX_FILENAME];
621 char cookie[MAX_FILENAME];
623 struct PlayerInfo default_player;
624 int version_10_file = FALSE;
626 if (mode==PLAYER_LEVEL)
627 sprintf(filename,"%s/%s/%s",
628 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
630 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
632 if (!(file=fopen(filename,"r+")))
634 fprintf(stderr,"%s: cannot save player information '%s'!\n",
639 fgets(cookie,NAMES_COOKIE_LEN,file);
640 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
641 version_10_file = TRUE;
642 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
644 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
652 for(i=0;i<MAX_NAMELEN;i++)
653 default_player.login_name[i] = fgetc(file);
654 for(i=0;i<MAX_NAMELEN;i++)
655 default_player.alias_name[i] = fgetc(file);
656 default_player.handicap = fgetc(file);
657 default_player.setup = (fgetc(file)<<8) | fgetc(file);
658 default_player.leveldir_nr = fgetc(file);
659 if (!version_10_file)
661 default_player.level_nr = fgetc(file);
662 for(i=0;i<10;i++) /* currently unused bytes */
666 default_player.level_nr = default_player.handicap;
668 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
670 else /* prüfen, ob Spieler in Liste enthalten */
671 if (!strncmp(default_player.login_name,player.login_name,MAX_NAMELEN-1))
673 fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
678 player.level_nr = level_nr;
680 for(i=0;i<MAX_NAMELEN;i++)
681 fputc(player.login_name[i],file);
682 for(i=0;i<MAX_NAMELEN;i++)
683 fputc(player.alias_name[i],file);
684 fputc(player.handicap,file);
685 fputc(player.setup / 256,file);
686 fputc(player.setup % 256,file);
687 fputc(player.leveldir_nr,file);
688 if (!version_10_file)
690 fputc(player.level_nr,file);
691 for(i=0;i<10;i++) /* currently unused bytes */
698 void LoadJoystickData()
704 if (joystick_status==JOYSTICK_OFF)
708 if (!(file=fopen(JOYDAT_FILE,"r")))
711 fscanf(file,"%s",cookie);
712 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
714 fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
721 fscanf(file,"%s",cookie);
722 fscanf(file, "%d %d %d \n",
723 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
724 fscanf(file, "%d %d %d \n",
725 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
731 load_joystick_data(JOYDAT_FILE);
735 void SaveJoystickData()
740 if (joystick_status==JOYSTICK_OFF)
746 if (!(file=fopen(JOYDAT_FILE,"w")))
748 fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
752 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
755 fprintf(file,"JOYSTICK_%d_DATA\n",i);
756 fprintf(file, "%d %d %d \n",
757 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
758 fprintf(file, "%d %d %d \n",
759 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
763 chmod(JOYDAT_FILE, JOYDAT_PERMS);
765 save_joystick_data(JOYDAT_FILE);