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];
223 BOOL levelrec_10 = FALSE;
226 sprintf(filename,"%s/%s/%d.tape",
227 level_directory,leveldir[leveldir_nr].filename,level_nr);
229 sprintf(filename,"%s/%s/%d.tap",
230 level_directory,leveldir[leveldir_nr].filename,level_nr);
233 if ((file=fopen(filename,"r")))
235 fgets(cookie,LEVELREC_COOKIE_LEN,file);
237 if (!strcmp(cookie,LEVELREC_COOKIE_10)) /* old 1.0 tape format */
239 else if (strcmp(cookie,LEVELREC_COOKIE)) /* unknown tape format */
241 fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
252 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
254 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
256 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
258 tape.level_nr = level_nr;
260 tape.changed = FALSE;
262 tape.recording = FALSE;
263 tape.playing = FALSE;
264 tape.pausing = FALSE;
266 for(i=0;i<tape.length;i++)
270 if (i >= MAX_TAPELEN)
273 for(j=0; j<MAX_PLAYERS; j++)
275 if (levelrec_10 && j>0)
277 tape.pos[i].joystickdata[j] = MV_NO_MOVING;
280 tape.pos[i].joystickdata[j] = fgetc(file);
283 tape.pos[i].delay = fgetc(file);
291 if (i != tape.length)
292 fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
295 tape.length_seconds = GetTapeLength();
298 void LoadScore(int level_nr)
301 char filename[MAX_FILENAME];
302 char cookie[MAX_FILENAME];
305 sprintf(filename,"%s/%s/%s",
306 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
308 if (!(file=fopen(filename,"r")))
310 if (!CreateNewScoreFile())
312 fprintf(stderr,"%s: cannot create score file '%s'!\n",
315 else if (!(file=fopen(filename,"r")))
317 fprintf(stderr,"%s: cannot load score for level %d!\n",
324 fgets(cookie,SCORE_COOKIE_LEN,file);
325 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
327 fprintf(stderr,"%s: wrong format of score file!\n",progname);
336 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
338 for(i=0;i<MAX_SCORE_ENTRIES;i++)
340 for(j=0;j<MAX_NAMELEN;j++)
341 highscore[i].Name[j] = fgetc(file);
342 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
348 for(i=0;i<MAX_SCORE_ENTRIES;i++)
350 strcpy(highscore[i].Name,EMPTY_ALIAS);
351 highscore[i].Score = 0;
356 void LoadPlayerInfo(int mode)
359 char filename[MAX_FILENAME];
360 char cookie[MAX_FILENAME];
362 char *login_name = GetLoginName();
363 struct PlayerInfo default_player, new_player;
364 int version_10_file = FALSE;
366 if (mode==PLAYER_LEVEL)
367 sprintf(filename,"%s/%s/%s",
368 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
370 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
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;
381 new_player = default_player;
383 if (!(file=fopen(filename,"r")))
385 if (!CreateNewNamesFile(mode))
387 fprintf(stderr,"%s: cannot create names file '%s'!\n",
390 else if (!(file=fopen(filename,"r")))
392 fprintf(stderr,"%s: cannot load player information '%s'!\n",
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? */
404 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
413 *local_player = default_player;
414 level_nr = default_player.level_nr;
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)
429 new_player.level_nr = fgetc(file);
430 for(i=0;i<10;i++) /* currently unused bytes */
434 new_player.level_nr = new_player.handicap;
436 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
438 new_player = default_player;
441 if (!(file=fopen(filename,"a")))
443 fprintf(stderr,"%s: cannot append new player to names file '%s'!\n",
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)
458 fputc(new_player.level_nr,file);
459 for(i=0;i<10;i++) /* currently unused bytes */
465 else /* prüfen, ob Spieler in Liste enthalten */
466 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
470 if (mode==PLAYER_SETUP)
472 *local_player = new_player;
473 if (local_player->leveldir_nr < num_leveldirs)
474 leveldir_nr = local_player->leveldir_nr;
480 local_player->handicap = new_player.handicap;
481 local_player->level_nr = new_player.level_nr;
484 level_nr = local_player->level_nr;
488 void SaveLevel(int level_nr)
491 char filename[MAX_FILENAME];
494 sprintf(filename,"%s/%s/%d",
495 level_directory,leveldir[leveldir_nr].filename,level_nr);
497 if (!(file=fopen(filename,"w")))
499 fprintf(stderr,"%s: cannot save level file '%s'!\n",progname,filename);
503 fputs(LEVEL_COOKIE,file); /* Formatkennung */
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);
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);
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);
526 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
529 for(y=0;y<lev_fieldy;y++)
530 for(x=0;x<lev_fieldx;x++)
531 fputc(Ur[x][y],file);
535 chmod(filename, LEVEL_PERMS);
538 void SaveLevelTape(int level_nr)
541 char filename[MAX_FILENAME];
543 BOOL new_tape = TRUE;
546 sprintf(filename,"%s/%s/%d.tape",
547 level_directory,leveldir[leveldir_nr].filename,level_nr);
549 sprintf(filename,"%s/%s/%d.tap",
550 level_directory,leveldir[leveldir_nr].filename,level_nr);
553 /* Testen, ob bereits eine Aufnahme existiert */
554 if ((file=fopen(filename,"r")))
559 if (!AreYouSure("Replace old tape ?",AYS_ASK))
563 if (!(file=fopen(filename,"w")))
565 fprintf(stderr,"%s: cannot save level recording file '%s'!\n",
570 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
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);
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);
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);
588 for(i=0;i<tape.length;i++)
592 for(j=0; j<MAX_PLAYERS; j++)
593 fputc(tape.pos[i].joystickdata[j],file);
595 fputc(tape.pos[i].delay,file);
600 chmod(filename, LEVREC_PERMS);
602 tape.changed = FALSE;
605 AreYouSure("tape saved !",AYS_CONFIRM);
608 void SaveScore(int level_nr)
611 char filename[MAX_FILENAME];
614 sprintf(filename,"%s/%s/%s",
615 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
617 if (!(file=fopen(filename,"r+")))
619 fprintf(stderr,"%s: cannot save score for level %d!\n",
625 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
627 for(i=0;i<MAX_SCORE_ENTRIES;i++)
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);
637 void SavePlayerInfo(int mode)
640 char filename[MAX_FILENAME];
641 char cookie[MAX_FILENAME];
643 struct PlayerInfo default_player;
644 int version_10_file = FALSE;
646 if (mode==PLAYER_LEVEL)
647 sprintf(filename,"%s/%s/%s",
648 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
650 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
652 if (!(file=fopen(filename,"r+")))
654 fprintf(stderr,"%s: cannot save player information '%s'!\n",
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? */
664 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
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)
681 default_player.level_nr = fgetc(file);
682 for(i=0;i<10;i++) /* currently unused bytes */
686 default_player.level_nr = default_player.handicap;
688 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
690 else /* prüfen, ob Spieler in Liste enthalten */
691 if (!strncmp(default_player.login_name,
692 local_player->login_name, MAX_NAMELEN-1))
694 fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
699 local_player->level_nr = level_nr;
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)
711 fputc(local_player->level_nr,file);
712 for(i=0;i<10;i++) /* currently unused bytes */
719 void LoadJoystickData()
725 if (joystick_status==JOYSTICK_OFF)
729 if (!(file=fopen(JOYDAT_FILE,"r")))
732 fscanf(file,"%s",cookie);
733 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
735 fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
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);
752 load_joystick_data(JOYDAT_FILE);
756 void SaveJoystickData()
761 if (joystick_status==JOYSTICK_OFF)
767 if (!(file=fopen(JOYDAT_FILE,"w")))
769 fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
773 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
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);
784 chmod(JOYDAT_FILE, JOYDAT_PERMS);
786 save_joystick_data(JOYDAT_FILE);