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 ***********************************************************/
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];
223 sprintf(filename,"%s/%s/%d.tape",
224 level_directory,leveldir[leveldir_nr].filename,level_nr);
226 if ((file=fopen(filename,"r")))
228 fgets(cookie,LEVELREC_COOKIE_LEN,file);
230 if (strcmp(cookie,LEVELREC_COOKIE)) /* ungültiges Format? */
232 fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
243 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
245 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
247 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
249 tape.level_nr = level_nr;
251 tape.changed = FALSE;
253 tape.recording = FALSE;
254 tape.playing = FALSE;
255 tape.pausing = FALSE;
257 for(i=0;i<tape.length;i++)
261 tape.pos[i].joystickdata = fgetc(file);
262 tape.pos[i].delay = fgetc(file);
269 if (i != tape.length)
270 fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
273 tape.length_seconds = GetTapeLength();
276 void LoadScore(int level_nr)
279 char filename[MAX_FILENAME];
280 char cookie[MAX_FILENAME];
283 sprintf(filename,"%s/%s/%s",
284 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
286 if (!(file=fopen(filename,"r")))
288 if (!CreateNewScoreFile())
290 fprintf(stderr,"%s: cannot create score file '%s'!\n",
293 else if (!(file=fopen(filename,"r")))
295 fprintf(stderr,"%s: cannot load score for level %d!\n",
302 fgets(cookie,SCORE_COOKIE_LEN,file);
303 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
305 fprintf(stderr,"%s: wrong format of score file!\n",progname);
314 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
316 for(i=0;i<MAX_SCORE_ENTRIES;i++)
318 for(j=0;j<MAX_NAMELEN;j++)
319 highscore[i].Name[j] = fgetc(file);
320 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
326 for(i=0;i<MAX_SCORE_ENTRIES;i++)
328 strcpy(highscore[i].Name,EMPTY_ALIAS);
329 highscore[i].Score = 0;
334 void LoadPlayerInfo(int mode)
337 char filename[MAX_FILENAME];
338 char cookie[MAX_FILENAME];
340 char *login_name = GetLoginName();
341 struct PlayerInfo default_player, new_player;
342 int version_10_file = FALSE;
344 if (mode==PLAYER_LEVEL)
345 sprintf(filename,"%s/%s/%s",
346 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
348 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
350 for(i=0;i<MAX_NAMELEN;i++)
351 default_player.login_name[i] = default_player.alias_name[i] = 0;
352 strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
353 strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
354 default_player.handicap = 0;
355 default_player.setup = DEFAULT_SETUP;
356 default_player.leveldir_nr = 0;
357 default_player.level_nr = 0;
359 new_player = default_player;
361 if (!(file=fopen(filename,"r")))
363 if (!CreateNewNamesFile(mode))
365 fprintf(stderr,"%s: cannot create names file '%s'!\n",
368 else if (!(file=fopen(filename,"r")))
370 fprintf(stderr,"%s: cannot load player information '%s'!\n",
377 fgets(cookie,NAMES_COOKIE_LEN,file);
378 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
379 version_10_file = TRUE;
380 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
382 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
391 player = default_player;
392 level_nr = default_player.level_nr;
398 for(i=0;i<MAX_NAMELEN;i++)
399 new_player.login_name[i] = fgetc(file);
400 for(i=0;i<MAX_NAMELEN;i++)
401 new_player.alias_name[i] = fgetc(file);
402 new_player.handicap = fgetc(file);
403 new_player.setup = (fgetc(file)<<8) | fgetc(file);
404 new_player.leveldir_nr = fgetc(file);
405 if (!version_10_file)
407 new_player.level_nr = fgetc(file);
408 for(i=0;i<10;i++) /* currently unused bytes */
412 new_player.level_nr = new_player.handicap;
414 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
416 new_player = default_player;
419 if (!(file=fopen(filename,"a")))
421 fprintf(stderr,"%s: cannot append new player to names file '%s'!\n",
426 for(i=0;i<MAX_NAMELEN;i++)
427 fputc(new_player.login_name[i],file);
428 for(i=0;i<MAX_NAMELEN;i++)
429 fputc(new_player.alias_name[i],file);
430 fputc(new_player.handicap,file);
431 fputc(new_player.setup / 256,file);
432 fputc(new_player.setup % 256,file);
433 fputc(new_player.leveldir_nr,file);
434 if (!version_10_file)
436 fputc(new_player.level_nr,file);
437 for(i=0;i<10;i++) /* currently unused bytes */
443 else /* prüfen, ob Spieler in Liste enthalten */
444 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
448 if (mode==PLAYER_SETUP)
451 if (player.leveldir_nr < num_leveldirs)
452 leveldir_nr = player.leveldir_nr;
458 player.handicap = new_player.handicap;
459 player.level_nr = new_player.level_nr;
462 level_nr = player.level_nr;
466 void SaveLevel(int level_nr)
469 char filename[MAX_FILENAME];
472 sprintf(filename,"%s/%s/%d",
473 level_directory,leveldir[leveldir_nr].filename,level_nr);
475 if (!(file=fopen(filename,"w")))
477 fprintf(stderr,"%s: cannot save level file '%s'!\n",progname,filename);
481 fputs(LEVEL_COOKIE,file); /* Formatkennung */
484 fputc(level.fieldx,file);
485 fputc(level.fieldy,file);
486 fputc(level.time / 256,file);
487 fputc(level.time % 256,file);
488 fputc(level.edelsteine / 256,file);
489 fputc(level.edelsteine % 256,file);
491 for(i=0;i<MAX_LEVNAMLEN;i++)
492 fputc(level.name[i],file);
493 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
494 fputc(level.score[i],file);
498 fputc(level.mampfer_inhalt[i][x][y],file);
499 fputc(level.tempo_amoebe,file);
500 fputc(level.dauer_sieb,file);
501 fputc(level.dauer_ablenk,file);
502 fputc(level.amoebe_inhalt,file);
504 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
507 for(y=0;y<lev_fieldy;y++)
508 for(x=0;x<lev_fieldx;x++)
509 fputc(Ur[x][y],file);
513 chmod(filename, LEVEL_PERMS);
516 void SaveLevelTape(int level_nr)
519 char filename[MAX_FILENAME];
521 BOOL new_tape = TRUE;
523 sprintf(filename,"%s/%s/%d.tape",
524 level_directory,leveldir[leveldir_nr].filename,level_nr);
526 /* Testen, ob bereits eine Aufnahme existiert */
527 if ((file=fopen(filename,"r")))
532 if (!AreYouSure("Replace old tape ?",AYS_ASK))
536 if (!(file=fopen(filename,"w")))
538 fprintf(stderr,"%s: cannot save level recording file '%s'!\n",
543 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
546 fputc((tape.random_seed >> 24) & 0xff,file);
547 fputc((tape.random_seed >> 16) & 0xff,file);
548 fputc((tape.random_seed >> 8) & 0xff,file);
549 fputc((tape.random_seed >> 0) & 0xff,file);
551 fputc((tape.date >> 24) & 0xff,file);
552 fputc((tape.date >> 16) & 0xff,file);
553 fputc((tape.date >> 8) & 0xff,file);
554 fputc((tape.date >> 0) & 0xff,file);
556 fputc((tape.length >> 24) & 0xff,file);
557 fputc((tape.length >> 16) & 0xff,file);
558 fputc((tape.length >> 8) & 0xff,file);
559 fputc((tape.length >> 0) & 0xff,file);
561 for(i=0;i<tape.length;i++)
563 fputc(tape.pos[i].joystickdata,file);
564 fputc(tape.pos[i].delay,file);
569 chmod(filename, LEVREC_PERMS);
571 tape.changed = FALSE;
574 AreYouSure("tape saved !",AYS_CONFIRM);
577 void SaveScore(int level_nr)
580 char filename[MAX_FILENAME];
583 sprintf(filename,"%s/%s/%s",
584 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
586 if (!(file=fopen(filename,"r+")))
588 fprintf(stderr,"%s: cannot save score for level %d!\n",
594 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
596 for(i=0;i<MAX_SCORE_ENTRIES;i++)
598 for(j=0;j<MAX_NAMELEN;j++)
599 fputc(highscore[i].Name[j],file);
600 fputc(highscore[i].Score / 256,file);
601 fputc(highscore[i].Score % 256,file);
606 void SavePlayerInfo(int mode)
609 char filename[MAX_FILENAME];
610 char cookie[MAX_FILENAME];
612 struct PlayerInfo default_player;
613 int version_10_file = FALSE;
615 if (mode==PLAYER_LEVEL)
616 sprintf(filename,"%s/%s/%s",
617 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
619 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
621 if (!(file=fopen(filename,"r+")))
623 fprintf(stderr,"%s: cannot save player information '%s'!\n",
628 fgets(cookie,NAMES_COOKIE_LEN,file);
629 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
630 version_10_file = TRUE;
631 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
633 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
641 for(i=0;i<MAX_NAMELEN;i++)
642 default_player.login_name[i] = fgetc(file);
643 for(i=0;i<MAX_NAMELEN;i++)
644 default_player.alias_name[i] = fgetc(file);
645 default_player.handicap = fgetc(file);
646 default_player.setup = (fgetc(file)<<8) | fgetc(file);
647 default_player.leveldir_nr = fgetc(file);
648 if (!version_10_file)
650 default_player.level_nr = fgetc(file);
651 for(i=0;i<10;i++) /* currently unused bytes */
655 default_player.level_nr = default_player.handicap;
657 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
659 else /* prüfen, ob Spieler in Liste enthalten */
660 if (!strncmp(default_player.login_name,player.login_name,MAX_NAMELEN-1))
662 fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
667 player.level_nr = level_nr;
669 for(i=0;i<MAX_NAMELEN;i++)
670 fputc(player.login_name[i],file);
671 for(i=0;i<MAX_NAMELEN;i++)
672 fputc(player.alias_name[i],file);
673 fputc(player.handicap,file);
674 fputc(player.setup / 256,file);
675 fputc(player.setup % 256,file);
676 fputc(player.leveldir_nr,file);
677 if (!version_10_file)
679 fputc(player.level_nr,file);
680 for(i=0;i<10;i++) /* currently unused bytes */
687 void LoadJoystickData()
693 if (joystick_status==JOYSTICK_OFF)
696 if (!(file=fopen(JOYDAT_FILE,"r")))
699 fscanf(file,"%s",cookie);
700 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
702 fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
709 fscanf(file,"%s",cookie);
710 fscanf(file, "%d %d %d \n",
711 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
712 fscanf(file, "%d %d %d \n",
713 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
720 void SaveJoystickData()
725 if (joystick_status==JOYSTICK_OFF)
730 if (!(file=fopen(JOYDAT_FILE,"w")))
732 fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
736 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
739 fprintf(file,"JOYSTICK_%d_DATA\n",i);
740 fprintf(file, "%d %d %d \n",
741 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
742 fprintf(file, "%d %d %d \n",
743 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
747 chmod(JOYDAT_FILE, JOYDAT_PERMS);