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];
224 sprintf(filename,"%s/%s/%d.tape",
225 level_directory,leveldir[leveldir_nr].filename,level_nr);
227 if ((file=fopen(filename,"r")))
229 fgets(cookie,LEVELREC_COOKIE_LEN,file);
231 if (strcmp(cookie,LEVELREC_COOKIE)) /* ungültiges Format? */
233 fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
244 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
246 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
248 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
250 tape.level_nr = level_nr;
252 tape.changed = FALSE;
254 tape.recording = FALSE;
255 tape.playing = FALSE;
256 tape.pausing = FALSE;
258 for(i=0;i<tape.length;i++)
262 tape.pos[i].joystickdata = fgetc(file);
263 tape.pos[i].delay = fgetc(file);
270 if (i != tape.length)
271 fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
274 tape.length_seconds = GetTapeLength();
277 void LoadScore(int level_nr)
280 char filename[MAX_FILENAME];
281 char cookie[MAX_FILENAME];
284 sprintf(filename,"%s/%s/%s",
285 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
287 if (!(file=fopen(filename,"r")))
289 if (!CreateNewScoreFile())
291 fprintf(stderr,"%s: cannot create score file '%s'!\n",
294 else if (!(file=fopen(filename,"r")))
296 fprintf(stderr,"%s: cannot load score for level %d!\n",
303 fgets(cookie,SCORE_COOKIE_LEN,file);
304 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
306 fprintf(stderr,"%s: wrong format of score file!\n",progname);
315 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
317 for(i=0;i<MAX_SCORE_ENTRIES;i++)
319 for(j=0;j<MAX_NAMELEN;j++)
320 highscore[i].Name[j] = fgetc(file);
321 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
327 for(i=0;i<MAX_SCORE_ENTRIES;i++)
329 strcpy(highscore[i].Name,EMPTY_ALIAS);
330 highscore[i].Score = 0;
335 void LoadPlayerInfo(int mode)
338 char filename[MAX_FILENAME];
339 char cookie[MAX_FILENAME];
341 char *login_name = GetLoginName();
342 struct PlayerInfo default_player, new_player;
343 int version_10_file = FALSE;
345 if (mode==PLAYER_LEVEL)
346 sprintf(filename,"%s/%s/%s",
347 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
349 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
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;
360 new_player = default_player;
362 if (!(file=fopen(filename,"r")))
364 if (!CreateNewNamesFile(mode))
366 fprintf(stderr,"%s: cannot create names file '%s'!\n",
369 else if (!(file=fopen(filename,"r")))
371 fprintf(stderr,"%s: cannot load player information '%s'!\n",
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? */
383 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
392 player = default_player;
393 level_nr = default_player.level_nr;
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)
408 new_player.level_nr = fgetc(file);
409 for(i=0;i<10;i++) /* currently unused bytes */
413 new_player.level_nr = new_player.handicap;
415 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
417 new_player = default_player;
420 if (!(file=fopen(filename,"a")))
422 fprintf(stderr,"%s: cannot append new player to names file '%s'!\n",
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)
437 fputc(new_player.level_nr,file);
438 for(i=0;i<10;i++) /* currently unused bytes */
444 else /* prüfen, ob Spieler in Liste enthalten */
445 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
449 if (mode==PLAYER_SETUP)
452 if (player.leveldir_nr < num_leveldirs)
453 leveldir_nr = player.leveldir_nr;
459 player.handicap = new_player.handicap;
460 player.level_nr = new_player.level_nr;
463 level_nr = player.level_nr;
467 void SaveLevel(int level_nr)
470 char filename[MAX_FILENAME];
473 sprintf(filename,"%s/%s/%d",
474 level_directory,leveldir[leveldir_nr].filename,level_nr);
476 if (!(file=fopen(filename,"w")))
478 fprintf(stderr,"%s: cannot save level file '%s'!\n",progname,filename);
482 fputs(LEVEL_COOKIE,file); /* Formatkennung */
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);
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);
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);
505 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
508 for(y=0;y<lev_fieldy;y++)
509 for(x=0;x<lev_fieldx;x++)
510 fputc(Ur[x][y],file);
514 chmod(filename, LEVEL_PERMS);
517 void SaveLevelTape(int level_nr)
520 char filename[MAX_FILENAME];
522 BOOL new_tape = TRUE;
524 sprintf(filename,"%s/%s/%d.tape",
525 level_directory,leveldir[leveldir_nr].filename,level_nr);
527 /* Testen, ob bereits eine Aufnahme existiert */
528 if ((file=fopen(filename,"r")))
533 if (!AreYouSure("Replace old tape ?",AYS_ASK))
537 if (!(file=fopen(filename,"w")))
539 fprintf(stderr,"%s: cannot save level recording file '%s'!\n",
544 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
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);
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);
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);
562 for(i=0;i<tape.length;i++)
564 fputc(tape.pos[i].joystickdata,file);
565 fputc(tape.pos[i].delay,file);
570 chmod(filename, LEVREC_PERMS);
572 tape.changed = FALSE;
575 AreYouSure("tape saved !",AYS_CONFIRM);
578 void SaveScore(int level_nr)
581 char filename[MAX_FILENAME];
584 sprintf(filename,"%s/%s/%s",
585 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
587 if (!(file=fopen(filename,"r+")))
589 fprintf(stderr,"%s: cannot save score for level %d!\n",
595 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
597 for(i=0;i<MAX_SCORE_ENTRIES;i++)
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);
607 void SavePlayerInfo(int mode)
610 char filename[MAX_FILENAME];
611 char cookie[MAX_FILENAME];
613 struct PlayerInfo default_player;
614 int version_10_file = FALSE;
616 if (mode==PLAYER_LEVEL)
617 sprintf(filename,"%s/%s/%s",
618 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
620 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
622 if (!(file=fopen(filename,"r+")))
624 fprintf(stderr,"%s: cannot save player information '%s'!\n",
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? */
634 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
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)
651 default_player.level_nr = fgetc(file);
652 for(i=0;i<10;i++) /* currently unused bytes */
656 default_player.level_nr = default_player.handicap;
658 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
660 else /* prüfen, ob Spieler in Liste enthalten */
661 if (!strncmp(default_player.login_name,player.login_name,MAX_NAMELEN-1))
663 fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
668 player.level_nr = level_nr;
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)
680 fputc(player.level_nr,file);
681 for(i=0;i<10;i++) /* currently unused bytes */
688 void LoadJoystickData()
694 if (joystick_status==JOYSTICK_OFF)
697 if (!(file=fopen(JOYDAT_FILE,"r")))
700 fscanf(file,"%s",cookie);
701 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
703 fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
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);
721 void SaveJoystickData()
726 if (joystick_status==JOYSTICK_OFF)
731 if (!(file=fopen(JOYDAT_FILE,"w")))
733 fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
737 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
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);
748 chmod(JOYDAT_FILE, JOYDAT_PERMS);