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 Error(ERR_RETURN, "cannot load level info '%s'", filename);
90 fscanf(file,"%s\n",cookie);
91 if (strcmp(cookie,LEVELDIR_COOKIE)) /* ungültiges Format? */
93 Error(ERR_RETURN, "wrong format of level info file");
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 Error(ERR_RETURN, "empty level info '%s'", 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 Error(ERR_RETURN, "cannot load level '%s'", filename);
139 fgets(cookie,LEVEL_COOKIE_LEN,file);
142 if (strcmp(cookie,LEVEL_COOKIE)) /* ungültiges Format? */
144 Error(ERR_RETURN, "wrong format of level file '%s'", filename);
152 lev_fieldx = level.fieldx = fgetc(file);
153 lev_fieldy = level.fieldy = fgetc(file);
155 level.time = (fgetc(file)<<8) | fgetc(file);
156 level.edelsteine = (fgetc(file)<<8) | fgetc(file);
157 for(i=0;i<MAX_LEVNAMLEN;i++)
158 level.name[i] = fgetc(file);
159 level.name[MAX_LEVNAMLEN-1] = 0;
160 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
161 level.score[i] = fgetc(file);
165 level.mampfer_inhalt[i][x][y] = fgetc(file);
166 level.tempo_amoebe = fgetc(file);
167 level.dauer_sieb = fgetc(file);
168 level.dauer_ablenk = fgetc(file);
169 level.amoebe_inhalt = fgetc(file);
171 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
174 for(y=0;y<MAX_LEV_FIELDY;y++)
175 for(x=0;x<MAX_LEV_FIELDX;x++)
176 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
178 for(y=0;y<lev_fieldy;y++)
179 for(x=0;x<lev_fieldx;x++)
180 Feld[x][y] = Ur[x][y] = fgetc(file);
184 if (level.time<=10) /* Mindestspieldauer */
189 lev_fieldx = level.fieldx = STD_LEV_FIELDX;
190 lev_fieldy = level.fieldy = STD_LEV_FIELDY;
193 level.edelsteine = 0;
194 strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
195 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
200 level.mampfer_inhalt[i][x][y] = EL_FELSBROCKEN;
201 level.tempo_amoebe = 10;
202 level.dauer_sieb = 10;
203 level.dauer_ablenk = 10;
204 level.amoebe_inhalt = EL_DIAMANT;
206 for(y=0;y<STD_LEV_FIELDY;y++)
207 for(x=0;x<STD_LEV_FIELDX;x++)
208 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
209 Feld[0][0] = Ur[0][0] = EL_SPIELFIGUR;
210 Feld[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
211 Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_AUSGANG_ZU;
215 void LoadLevelTape(int level_nr)
218 char filename[MAX_FILENAME];
219 char cookie[MAX_FILENAME];
221 BOOL levelrec_10 = FALSE;
224 sprintf(filename,"%s/%s/%d.tape",
225 level_directory,leveldir[leveldir_nr].filename,level_nr);
227 sprintf(filename,"%s/%s/%d.tap",
228 level_directory,leveldir[leveldir_nr].filename,level_nr);
231 if ((file=fopen(filename,"r")))
233 fgets(cookie,LEVELREC_COOKIE_LEN,file);
235 if (!strcmp(cookie,LEVELREC_COOKIE_10)) /* old 1.0 tape format */
237 else if (strcmp(cookie,LEVELREC_COOKIE)) /* unknown tape format */
239 Error(ERR_RETURN, "wrong format of level recording file '%s'", filename);
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 if (i >= MAX_TAPELEN)
270 for(j=0; j<MAX_PLAYERS; j++)
272 if (levelrec_10 && j>0)
274 tape.pos[i].joystickdata[j] = MV_NO_MOVING;
277 tape.pos[i].joystickdata[j] = fgetc(file);
280 tape.pos[i].delay = fgetc(file);
288 if (i != tape.length)
289 Error(ERR_RETURN, "level recording file '%s' corrupted", filename);
291 tape.length_seconds = GetTapeLength();
294 void LoadScore(int level_nr)
297 char filename[MAX_FILENAME];
298 char cookie[MAX_FILENAME];
301 sprintf(filename,"%s/%s/%s",
302 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
304 if (!(file = fopen(filename,"r")))
306 if (!CreateNewScoreFile())
307 Error(ERR_RETURN, "cannot create score file '%s'", filename);
308 else if (!(file = fopen(filename,"r")))
309 Error(ERR_RETURN, "cannot load score for level %d", level_nr);
314 fgets(cookie,SCORE_COOKIE_LEN,file);
315 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
317 Error(ERR_RETURN, "wrong format of score file '%s'", filename);
326 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
328 for(i=0;i<MAX_SCORE_ENTRIES;i++)
330 for(j=0;j<MAX_NAMELEN;j++)
331 highscore[i].Name[j] = fgetc(file);
332 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
338 for(i=0;i<MAX_SCORE_ENTRIES;i++)
340 strcpy(highscore[i].Name,EMPTY_ALIAS);
341 highscore[i].Score = 0;
346 void LoadPlayerInfo(int mode)
349 char filename[MAX_FILENAME];
350 char cookie[MAX_FILENAME];
352 char *login_name = GetLoginName();
353 struct PlayerInfo default_player, new_player;
354 int version_10_file = FALSE;
356 if (mode==PLAYER_LEVEL)
357 sprintf(filename,"%s/%s/%s",
358 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
360 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
362 for(i=0;i<MAX_NAMELEN;i++)
363 default_player.login_name[i] = default_player.alias_name[i] = 0;
364 strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
365 strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
366 default_player.handicap = 0;
367 default_player.setup = DEFAULT_SETUP;
368 default_player.leveldir_nr = 0;
369 default_player.level_nr = 0;
371 new_player = default_player;
373 if (!(file = fopen(filename,"r")))
375 if (!CreateNewNamesFile(mode))
376 Error(ERR_RETURN, "cannot create names file '%s'", filename);
377 else if (!(file = fopen(filename,"r")))
378 Error(ERR_RETURN, "cannot load player information file '%s'", filename);
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 Error(ERR_RETURN, "wrong format of names file '%s'", filename);
396 *local_player = default_player;
397 level_nr = default_player.level_nr;
403 for(i=0;i<MAX_NAMELEN;i++)
404 new_player.login_name[i] = fgetc(file);
405 for(i=0;i<MAX_NAMELEN;i++)
406 new_player.alias_name[i] = fgetc(file);
407 new_player.handicap = fgetc(file);
408 new_player.setup = (fgetc(file)<<8) | fgetc(file);
409 new_player.leveldir_nr = fgetc(file);
410 if (!version_10_file)
412 new_player.level_nr = fgetc(file);
413 for(i=0;i<10;i++) /* currently unused bytes */
417 new_player.level_nr = new_player.handicap;
419 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
421 new_player = default_player;
424 if (!(file = fopen(filename,"a")))
425 Error(ERR_RETURN, "cannot append new player to names file '%s'",
429 for(i=0;i<MAX_NAMELEN;i++)
430 fputc(new_player.login_name[i],file);
431 for(i=0;i<MAX_NAMELEN;i++)
432 fputc(new_player.alias_name[i],file);
433 fputc(new_player.handicap,file);
434 fputc(new_player.setup / 256,file);
435 fputc(new_player.setup % 256,file);
436 fputc(new_player.leveldir_nr,file);
437 if (!version_10_file)
439 fputc(new_player.level_nr,file);
440 for(i=0;i<10;i++) /* currently unused bytes */
446 else /* prüfen, ob Spieler in Liste enthalten */
447 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
451 if (mode==PLAYER_SETUP)
453 *local_player = new_player;
454 if (local_player->leveldir_nr < num_leveldirs)
455 leveldir_nr = local_player->leveldir_nr;
461 local_player->handicap = new_player.handicap;
462 local_player->level_nr = new_player.level_nr;
465 level_nr = local_player->level_nr;
469 void SaveLevel(int level_nr)
472 char filename[MAX_FILENAME];
475 sprintf(filename,"%s/%s/%d",
476 level_directory,leveldir[leveldir_nr].filename,level_nr);
478 if (!(file=fopen(filename,"w")))
480 Error(ERR_RETURN, "cannot save level file '%s'", filename);
484 fputs(LEVEL_COOKIE,file); /* Formatkennung */
487 fputc(level.fieldx,file);
488 fputc(level.fieldy,file);
489 fputc(level.time / 256,file);
490 fputc(level.time % 256,file);
491 fputc(level.edelsteine / 256,file);
492 fputc(level.edelsteine % 256,file);
494 for(i=0;i<MAX_LEVNAMLEN;i++)
495 fputc(level.name[i],file);
496 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
497 fputc(level.score[i],file);
501 fputc(level.mampfer_inhalt[i][x][y],file);
502 fputc(level.tempo_amoebe,file);
503 fputc(level.dauer_sieb,file);
504 fputc(level.dauer_ablenk,file);
505 fputc(level.amoebe_inhalt,file);
507 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
510 for(y=0;y<lev_fieldy;y++)
511 for(x=0;x<lev_fieldx;x++)
512 fputc(Ur[x][y],file);
516 chmod(filename, LEVEL_PERMS);
519 void SaveLevelTape(int level_nr)
522 char filename[MAX_FILENAME];
524 BOOL new_tape = TRUE;
527 sprintf(filename,"%s/%s/%d.tape",
528 level_directory,leveldir[leveldir_nr].filename,level_nr);
530 sprintf(filename,"%s/%s/%d.tap",
531 level_directory,leveldir[leveldir_nr].filename,level_nr);
534 /* Testen, ob bereits eine Aufnahme existiert */
535 if ((file=fopen(filename,"r")))
540 if (!AreYouSure("Replace old tape ?",AYS_ASK))
544 if (!(file=fopen(filename,"w")))
546 Error(ERR_RETURN, "cannot save level recording file '%s'", filename);
550 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
553 fputc((tape.random_seed >> 24) & 0xff,file);
554 fputc((tape.random_seed >> 16) & 0xff,file);
555 fputc((tape.random_seed >> 8) & 0xff,file);
556 fputc((tape.random_seed >> 0) & 0xff,file);
558 fputc((tape.date >> 24) & 0xff,file);
559 fputc((tape.date >> 16) & 0xff,file);
560 fputc((tape.date >> 8) & 0xff,file);
561 fputc((tape.date >> 0) & 0xff,file);
563 fputc((tape.length >> 24) & 0xff,file);
564 fputc((tape.length >> 16) & 0xff,file);
565 fputc((tape.length >> 8) & 0xff,file);
566 fputc((tape.length >> 0) & 0xff,file);
568 for(i=0;i<tape.length;i++)
572 for(j=0; j<MAX_PLAYERS; j++)
573 fputc(tape.pos[i].joystickdata[j],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 Error(ERR_RETURN, "cannot save score for level %d", level_nr);
604 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
606 for(i=0;i<MAX_SCORE_ENTRIES;i++)
608 for(j=0;j<MAX_NAMELEN;j++)
609 fputc(highscore[i].Name[j],file);
610 fputc(highscore[i].Score / 256,file);
611 fputc(highscore[i].Score % 256,file);
616 void SavePlayerInfo(int mode)
619 char filename[MAX_FILENAME];
620 char cookie[MAX_FILENAME];
622 struct PlayerInfo default_player;
623 int version_10_file = FALSE;
625 if (mode==PLAYER_LEVEL)
626 sprintf(filename,"%s/%s/%s",
627 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
629 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
631 if (!(file = fopen(filename,"r+")))
633 Error(ERR_RETURN, "cannot save player information to file '%s'", filename);
637 fgets(cookie,NAMES_COOKIE_LEN,file);
638 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
639 version_10_file = TRUE;
640 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
642 Error(ERR_RETURN, "wrong format of names file '%s'", filename);
649 for(i=0;i<MAX_NAMELEN;i++)
650 default_player.login_name[i] = fgetc(file);
651 for(i=0;i<MAX_NAMELEN;i++)
652 default_player.alias_name[i] = fgetc(file);
653 default_player.handicap = fgetc(file);
654 default_player.setup = (fgetc(file)<<8) | fgetc(file);
655 default_player.leveldir_nr = fgetc(file);
656 if (!version_10_file)
658 default_player.level_nr = fgetc(file);
659 for(i=0;i<10;i++) /* currently unused bytes */
663 default_player.level_nr = default_player.handicap;
665 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
667 else /* prüfen, ob Spieler in Liste enthalten */
668 if (!strncmp(default_player.login_name,
669 local_player->login_name, MAX_NAMELEN-1))
671 fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
676 local_player->level_nr = level_nr;
678 for(i=0;i<MAX_NAMELEN;i++)
679 fputc(local_player->login_name[i],file);
680 for(i=0;i<MAX_NAMELEN;i++)
681 fputc(local_player->alias_name[i],file);
682 fputc(local_player->handicap,file);
683 fputc(local_player->setup / 256,file);
684 fputc(local_player->setup % 256,file);
685 fputc(local_player->leveldir_nr,file);
686 if (!version_10_file)
688 fputc(local_player->level_nr,file);
689 for(i=0;i<10;i++) /* currently unused bytes */
696 void LoadJoystickData()
702 if (joystick_status==JOYSTICK_OFF)
706 if (!(file=fopen(JOYDAT_FILE,"r")))
709 fscanf(file,"%s",cookie);
710 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
712 Error(ERR_RETURN, "wrong format of joystick file '%s'", JOYDAT_FILE);
719 fscanf(file,"%s",cookie);
720 fscanf(file, "%d %d %d \n",
721 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
722 fscanf(file, "%d %d %d \n",
723 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
729 load_joystick_data(JOYDAT_FILE);
733 void SaveJoystickData()
738 if (joystick_status==JOYSTICK_OFF)
744 if (!(file=fopen(JOYDAT_FILE,"w")))
746 Error(ERR_RETURN, "cannot save joystick calibration data to file '%s'",
751 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
754 fprintf(file,"JOYSTICK_%d_DATA\n",i);
755 fprintf(file, "%d %d %d \n",
756 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
757 fprintf(file, "%d %d %d \n",
758 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
762 chmod(JOYDAT_FILE, JOYDAT_PERMS);
764 save_joystick_data(JOYDAT_FILE);