1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back! *
3 *----------------------------------------------------------*
4 * (c) 1995-98 Artsoft Entertainment *
8 * phone: ++49 +521 290471 *
9 * email: aeglos@valinor.owl.de *
10 *----------------------------------------------------------*
12 ***********************************************************/
20 BOOL CreateNewScoreFile()
23 char filename[MAX_FILENAME];
24 char empty_alias[MAX_NAMELEN];
27 sprintf(filename,"%s/%s/%s",
28 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
30 if (!(file=fopen(filename,"w")))
33 for(i=0;i<MAX_NAMELEN;i++)
35 strncpy(empty_alias,EMPTY_ALIAS,MAX_NAMELEN-1);
37 fputs(SCORE_COOKIE,file); /* Formatkennung */
38 for(i=0;i<leveldir[leveldir_nr].levels;i++)
40 for(j=0;j<MAX_SCORE_ENTRIES;j++)
42 for(k=0;k<MAX_NAMELEN;k++)
43 fputc(empty_alias[k],file);
50 chmod(filename, SCORE_PERMS);
54 BOOL CreateNewNamesFile(int mode)
56 char filename[MAX_FILENAME];
59 if (mode==PLAYER_LEVEL)
60 sprintf(filename,"%s/%s/%s",
61 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
63 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
65 if (!(file=fopen(filename,"w")))
68 fputs(NAMES_COOKIE,file); /* Formatkennung */
71 chmod(filename, NAMES_PERMS);
78 char filename[MAX_FILENAME];
79 char cookie[MAX_FILENAME];
82 sprintf(filename,"%s/%s",level_directory,LEVDIR_FILENAME);
84 if (!(file=fopen(filename,"r")))
86 fprintf(stderr,"%s: cannot load level info '%s'!\n",progname,filename);
90 fscanf(file,"%s\n",cookie);
91 if (strcmp(cookie,LEVELDIR_COOKIE)) /* ungültiges Format? */
93 fprintf(stderr,"%s: wrong format of level info file!\n",progname);
100 for(i=0;i<MAX_LEVDIR_ENTRIES;i++)
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);
114 fprintf(stderr,"%s: empty level info '%s'!\n",progname,filename);
121 void LoadLevel(int level_nr)
124 char filename[MAX_FILENAME];
125 char cookie[MAX_FILENAME];
128 sprintf(filename,"%s/%s/%d",
129 level_directory,leveldir[leveldir_nr].filename,level_nr);
131 if (!(file=fopen(filename,"r")))
134 fprintf(stderr,"%s: cannot load level '%s'!\n",progname,filename);
139 fgets(cookie,LEVEL_COOKIE_LEN,file);
142 if (strcmp(cookie,LEVEL_COOKIE)) /* ungültiges Format? */
144 fprintf(stderr,"%s: wrong format of level file '%s'!\n",
153 lev_fieldx = level.fieldx = fgetc(file);
154 lev_fieldy = level.fieldy = fgetc(file);
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);
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);
172 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
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;
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);
185 if (level.time<=10) /* Mindestspieldauer */
190 lev_fieldx = level.fieldx = STD_LEV_FIELDX;
191 lev_fieldy = level.fieldy = STD_LEV_FIELDY;
194 level.edelsteine = 0;
195 strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
196 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
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;
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;
216 void LoadLevelTape(int level_nr)
219 char filename[MAX_FILENAME];
220 char cookie[MAX_FILENAME];
222 BOOL levelrec_10 = FALSE;
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_10)) /* old 1.0 tape format */
238 else if (strcmp(cookie,LEVELREC_COOKIE)) /* unknown tape format */
240 fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
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 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
257 tape.level_nr = level_nr;
259 tape.changed = FALSE;
261 tape.recording = FALSE;
262 tape.playing = FALSE;
263 tape.pausing = FALSE;
265 for(i=0;i<tape.length;i++)
269 if (i >= MAX_TAPELEN)
272 for(j=0; j<MAX_PLAYERS; j++)
274 if (levelrec_10 && j>0)
276 tape.pos[i].joystickdata[j] = MV_NO_MOVING;
279 tape.pos[i].joystickdata[j] = fgetc(file);
282 tape.pos[i].delay = fgetc(file);
290 if (i != tape.length)
291 fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
294 tape.length_seconds = GetTapeLength();
297 void LoadScore(int level_nr)
300 char filename[MAX_FILENAME];
301 char cookie[MAX_FILENAME];
304 sprintf(filename,"%s/%s/%s",
305 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
307 if (!(file=fopen(filename,"r")))
309 if (!CreateNewScoreFile())
311 fprintf(stderr,"%s: cannot create score file '%s'!\n",
314 else if (!(file=fopen(filename,"r")))
316 fprintf(stderr,"%s: cannot load score for level %d!\n",
323 fgets(cookie,SCORE_COOKIE_LEN,file);
324 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
326 fprintf(stderr,"%s: wrong format of score file!\n",progname);
335 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
337 for(i=0;i<MAX_SCORE_ENTRIES;i++)
339 for(j=0;j<MAX_NAMELEN;j++)
340 highscore[i].Name[j] = fgetc(file);
341 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
347 for(i=0;i<MAX_SCORE_ENTRIES;i++)
349 strcpy(highscore[i].Name,EMPTY_ALIAS);
350 highscore[i].Score = 0;
355 void LoadPlayerInfo(int mode)
358 char filename[MAX_FILENAME];
359 char cookie[MAX_FILENAME];
361 char *login_name = GetLoginName();
362 struct PlayerInfo default_player, new_player;
363 int version_10_file = FALSE;
365 if (mode==PLAYER_LEVEL)
366 sprintf(filename,"%s/%s/%s",
367 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
369 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
371 for(i=0;i<MAX_NAMELEN;i++)
372 default_player.login_name[i] = default_player.alias_name[i] = 0;
373 strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
374 strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
375 default_player.handicap = 0;
376 default_player.setup = DEFAULT_SETUP;
377 default_player.leveldir_nr = 0;
378 default_player.level_nr = 0;
380 new_player = default_player;
382 if (!(file=fopen(filename,"r")))
384 if (!CreateNewNamesFile(mode))
386 fprintf(stderr,"%s: cannot create names file '%s'!\n",
389 else if (!(file=fopen(filename,"r")))
391 fprintf(stderr,"%s: cannot load player information '%s'!\n",
398 fgets(cookie,NAMES_COOKIE_LEN,file);
399 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
400 version_10_file = TRUE;
401 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
403 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
412 *local_player = default_player;
413 level_nr = default_player.level_nr;
419 for(i=0;i<MAX_NAMELEN;i++)
420 new_player.login_name[i] = fgetc(file);
421 for(i=0;i<MAX_NAMELEN;i++)
422 new_player.alias_name[i] = fgetc(file);
423 new_player.handicap = fgetc(file);
424 new_player.setup = (fgetc(file)<<8) | fgetc(file);
425 new_player.leveldir_nr = fgetc(file);
426 if (!version_10_file)
428 new_player.level_nr = fgetc(file);
429 for(i=0;i<10;i++) /* currently unused bytes */
433 new_player.level_nr = new_player.handicap;
435 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
437 new_player = default_player;
440 if (!(file=fopen(filename,"a")))
442 fprintf(stderr,"%s: cannot append new player to names file '%s'!\n",
447 for(i=0;i<MAX_NAMELEN;i++)
448 fputc(new_player.login_name[i],file);
449 for(i=0;i<MAX_NAMELEN;i++)
450 fputc(new_player.alias_name[i],file);
451 fputc(new_player.handicap,file);
452 fputc(new_player.setup / 256,file);
453 fputc(new_player.setup % 256,file);
454 fputc(new_player.leveldir_nr,file);
455 if (!version_10_file)
457 fputc(new_player.level_nr,file);
458 for(i=0;i<10;i++) /* currently unused bytes */
464 else /* prüfen, ob Spieler in Liste enthalten */
465 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
469 if (mode==PLAYER_SETUP)
471 *local_player = new_player;
472 if (local_player->leveldir_nr < num_leveldirs)
473 leveldir_nr = local_player->leveldir_nr;
479 local_player->handicap = new_player.handicap;
480 local_player->level_nr = new_player.level_nr;
483 level_nr = local_player->level_nr;
487 void SaveLevel(int level_nr)
490 char filename[MAX_FILENAME];
493 sprintf(filename,"%s/%s/%d",
494 level_directory,leveldir[leveldir_nr].filename,level_nr);
496 if (!(file=fopen(filename,"w")))
498 fprintf(stderr,"%s: cannot save level file '%s'!\n",progname,filename);
502 fputs(LEVEL_COOKIE,file); /* Formatkennung */
505 fputc(level.fieldx,file);
506 fputc(level.fieldy,file);
507 fputc(level.time / 256,file);
508 fputc(level.time % 256,file);
509 fputc(level.edelsteine / 256,file);
510 fputc(level.edelsteine % 256,file);
512 for(i=0;i<MAX_LEVNAMLEN;i++)
513 fputc(level.name[i],file);
514 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
515 fputc(level.score[i],file);
519 fputc(level.mampfer_inhalt[i][x][y],file);
520 fputc(level.tempo_amoebe,file);
521 fputc(level.dauer_sieb,file);
522 fputc(level.dauer_ablenk,file);
523 fputc(level.amoebe_inhalt,file);
525 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
528 for(y=0;y<lev_fieldy;y++)
529 for(x=0;x<lev_fieldx;x++)
530 fputc(Ur[x][y],file);
534 chmod(filename, LEVEL_PERMS);
537 void SaveLevelTape(int level_nr)
540 char filename[MAX_FILENAME];
542 BOOL new_tape = TRUE;
545 sprintf(filename,"%s/%s/%d.tape",
546 level_directory,leveldir[leveldir_nr].filename,level_nr);
548 sprintf(filename,"%s/%s/%d.tap",
549 level_directory,leveldir[leveldir_nr].filename,level_nr);
552 /* Testen, ob bereits eine Aufnahme existiert */
553 if ((file=fopen(filename,"r")))
558 if (!AreYouSure("Replace old tape ?",AYS_ASK))
562 if (!(file=fopen(filename,"w")))
564 fprintf(stderr,"%s: cannot save level recording file '%s'!\n",
569 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
572 fputc((tape.random_seed >> 24) & 0xff,file);
573 fputc((tape.random_seed >> 16) & 0xff,file);
574 fputc((tape.random_seed >> 8) & 0xff,file);
575 fputc((tape.random_seed >> 0) & 0xff,file);
577 fputc((tape.date >> 24) & 0xff,file);
578 fputc((tape.date >> 16) & 0xff,file);
579 fputc((tape.date >> 8) & 0xff,file);
580 fputc((tape.date >> 0) & 0xff,file);
582 fputc((tape.length >> 24) & 0xff,file);
583 fputc((tape.length >> 16) & 0xff,file);
584 fputc((tape.length >> 8) & 0xff,file);
585 fputc((tape.length >> 0) & 0xff,file);
587 for(i=0;i<tape.length;i++)
591 for(j=0; j<MAX_PLAYERS; j++)
592 fputc(tape.pos[i].joystickdata[j],file);
594 fputc(tape.pos[i].delay,file);
599 chmod(filename, LEVREC_PERMS);
601 tape.changed = FALSE;
604 AreYouSure("tape saved !",AYS_CONFIRM);
607 void SaveScore(int level_nr)
610 char filename[MAX_FILENAME];
613 sprintf(filename,"%s/%s/%s",
614 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
616 if (!(file=fopen(filename,"r+")))
618 fprintf(stderr,"%s: cannot save score for level %d!\n",
624 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
626 for(i=0;i<MAX_SCORE_ENTRIES;i++)
628 for(j=0;j<MAX_NAMELEN;j++)
629 fputc(highscore[i].Name[j],file);
630 fputc(highscore[i].Score / 256,file);
631 fputc(highscore[i].Score % 256,file);
636 void SavePlayerInfo(int mode)
639 char filename[MAX_FILENAME];
640 char cookie[MAX_FILENAME];
642 struct PlayerInfo default_player;
643 int version_10_file = FALSE;
645 if (mode==PLAYER_LEVEL)
646 sprintf(filename,"%s/%s/%s",
647 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
649 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
651 if (!(file=fopen(filename,"r+")))
653 fprintf(stderr,"%s: cannot save player information '%s'!\n",
658 fgets(cookie,NAMES_COOKIE_LEN,file);
659 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
660 version_10_file = TRUE;
661 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
663 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
671 for(i=0;i<MAX_NAMELEN;i++)
672 default_player.login_name[i] = fgetc(file);
673 for(i=0;i<MAX_NAMELEN;i++)
674 default_player.alias_name[i] = fgetc(file);
675 default_player.handicap = fgetc(file);
676 default_player.setup = (fgetc(file)<<8) | fgetc(file);
677 default_player.leveldir_nr = fgetc(file);
678 if (!version_10_file)
680 default_player.level_nr = fgetc(file);
681 for(i=0;i<10;i++) /* currently unused bytes */
685 default_player.level_nr = default_player.handicap;
687 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
689 else /* prüfen, ob Spieler in Liste enthalten */
690 if (!strncmp(default_player.login_name,
691 local_player->login_name, MAX_NAMELEN-1))
693 fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
698 local_player->level_nr = level_nr;
700 for(i=0;i<MAX_NAMELEN;i++)
701 fputc(local_player->login_name[i],file);
702 for(i=0;i<MAX_NAMELEN;i++)
703 fputc(local_player->alias_name[i],file);
704 fputc(local_player->handicap,file);
705 fputc(local_player->setup / 256,file);
706 fputc(local_player->setup % 256,file);
707 fputc(local_player->leveldir_nr,file);
708 if (!version_10_file)
710 fputc(local_player->level_nr,file);
711 for(i=0;i<10;i++) /* currently unused bytes */
718 void LoadJoystickData()
724 if (joystick_status==JOYSTICK_OFF)
728 if (!(file=fopen(JOYDAT_FILE,"r")))
731 fscanf(file,"%s",cookie);
732 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
734 fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
741 fscanf(file,"%s",cookie);
742 fscanf(file, "%d %d %d \n",
743 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
744 fscanf(file, "%d %d %d \n",
745 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
751 load_joystick_data(JOYDAT_FILE);
755 void SaveJoystickData()
760 if (joystick_status==JOYSTICK_OFF)
766 if (!(file=fopen(JOYDAT_FILE,"w")))
768 fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
772 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
775 fprintf(file,"JOYSTICK_%d_DATA\n",i);
776 fprintf(file, "%d %d %d \n",
777 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
778 fprintf(file, "%d %d %d \n",
779 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
783 chmod(JOYDAT_FILE, JOYDAT_PERMS);
785 save_joystick_data(JOYDAT_FILE);