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_LEN];
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_LEN];
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_LEN];
79 char cookie[MAX_FILENAME_LEN];
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_LEN];
125 char cookie[MAX_FILENAME_LEN];
128 sprintf(filename,"%s/%s/%d",
129 level_directory,leveldir[leveldir_nr].filename,level_nr);
131 if (!(file = fopen(filename,"r")))
132 Error(ERR_RETURN, "cannot load level '%s' - creating new level", filename);
135 fgets(cookie,LEVEL_COOKIE_LEN,file);
138 if (strcmp(cookie,LEVEL_COOKIE)) /* ungültiges Format? */
140 Error(ERR_RETURN, "wrong format of level file '%s'", filename);
148 lev_fieldx = level.fieldx = fgetc(file);
149 lev_fieldy = level.fieldy = fgetc(file);
151 level.time = (fgetc(file)<<8) | fgetc(file);
152 level.edelsteine = (fgetc(file)<<8) | fgetc(file);
153 for(i=0;i<MAX_LEVNAMLEN;i++)
154 level.name[i] = fgetc(file);
155 level.name[MAX_LEVNAMLEN-1] = 0;
156 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
157 level.score[i] = fgetc(file);
161 level.mampfer_inhalt[i][x][y] = fgetc(file);
162 level.tempo_amoebe = fgetc(file);
163 level.dauer_sieb = fgetc(file);
164 level.dauer_ablenk = fgetc(file);
165 level.amoebe_inhalt = fgetc(file);
167 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
170 for(y=0;y<MAX_LEV_FIELDY;y++)
171 for(x=0;x<MAX_LEV_FIELDX;x++)
172 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
174 for(y=0;y<lev_fieldy;y++)
175 for(x=0;x<lev_fieldx;x++)
176 Feld[x][y] = Ur[x][y] = fgetc(file);
180 if (level.time<=10) /* Mindestspieldauer */
185 lev_fieldx = level.fieldx = STD_LEV_FIELDX;
186 lev_fieldy = level.fieldy = STD_LEV_FIELDY;
189 level.edelsteine = 0;
190 strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
191 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
196 level.mampfer_inhalt[i][x][y] = EL_FELSBROCKEN;
197 level.tempo_amoebe = 10;
198 level.dauer_sieb = 10;
199 level.dauer_ablenk = 10;
200 level.amoebe_inhalt = EL_DIAMANT;
202 for(y=0;y<STD_LEV_FIELDY;y++)
203 for(x=0;x<STD_LEV_FIELDX;x++)
204 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
205 Feld[0][0] = Ur[0][0] = EL_SPIELFIGUR;
206 Feld[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
207 Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_AUSGANG_ZU;
211 void LoadLevelTape(int level_nr)
214 char filename[MAX_FILENAME_LEN];
215 char cookie[MAX_FILENAME_LEN];
217 BOOL levelrec_10 = FALSE;
220 sprintf(filename,"%s/%s/%d.tape",
221 level_directory,leveldir[leveldir_nr].filename,level_nr);
223 sprintf(filename,"%s/%s/%d.tap",
224 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_10)) /* old 1.0 tape format */
233 else if (strcmp(cookie,LEVELREC_COOKIE)) /* unknown tape format */
235 Error(ERR_RETURN, "wrong format of level recording file '%s'", filename);
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 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
251 tape.level_nr = level_nr;
253 tape.changed = FALSE;
255 tape.recording = FALSE;
256 tape.playing = FALSE;
257 tape.pausing = FALSE;
259 for(i=0;i<tape.length;i++)
263 if (i >= MAX_TAPELEN)
266 for(j=0; j<MAX_PLAYERS; j++)
268 if (levelrec_10 && j>0)
270 tape.pos[i].action[j] = MV_NO_MOVING;
273 tape.pos[i].action[j] = fgetc(file);
276 tape.pos[i].delay = fgetc(file);
284 if (i != tape.length)
285 Error(ERR_RETURN, "level recording file '%s' corrupted", filename);
287 tape.length_seconds = GetTapeLength();
290 void LoadScore(int level_nr)
293 char filename[MAX_FILENAME_LEN];
294 char cookie[MAX_FILENAME_LEN];
297 sprintf(filename,"%s/%s/%s",
298 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
300 if (!(file = fopen(filename,"r")))
302 if (!CreateNewScoreFile())
303 Error(ERR_RETURN, "cannot create score file '%s'", filename);
304 else if (!(file = fopen(filename,"r")))
305 Error(ERR_RETURN, "cannot load score for level %d", level_nr);
310 fgets(cookie,SCORE_COOKIE_LEN,file);
311 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
313 Error(ERR_RETURN, "wrong format of score file '%s'", filename);
322 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
324 for(i=0;i<MAX_SCORE_ENTRIES;i++)
326 for(j=0;j<MAX_NAMELEN;j++)
327 highscore[i].Name[j] = fgetc(file);
328 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
334 for(i=0;i<MAX_SCORE_ENTRIES;i++)
336 strcpy(highscore[i].Name,EMPTY_ALIAS);
337 highscore[i].Score = 0;
342 void LoadPlayerInfo(int mode)
345 char filename[MAX_FILENAME_LEN];
346 char cookie[MAX_FILENAME_LEN];
348 char *login_name = GetLoginName();
349 struct PlayerInfo default_player, new_player;
350 int version_10_file = FALSE;
352 if (mode==PLAYER_LEVEL)
353 sprintf(filename,"%s/%s/%s",
354 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
356 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
358 for(i=0;i<MAX_NAMELEN;i++)
359 default_player.login_name[i] = default_player.alias_name[i] = 0;
360 strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
361 strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
362 default_player.handicap = 0;
363 default_player.setup = DEFAULT_SETUP;
364 default_player.leveldir_nr = 0;
365 default_player.level_nr = 0;
367 new_player = default_player;
369 if (!(file = fopen(filename,"r")))
371 if (!CreateNewNamesFile(mode))
372 Error(ERR_RETURN, "cannot create names file '%s'", filename);
373 else if (!(file = fopen(filename,"r")))
374 Error(ERR_RETURN, "cannot load player information file '%s'", filename);
379 fgets(cookie,NAMES_COOKIE_LEN,file);
380 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
381 version_10_file = TRUE;
382 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
384 Error(ERR_RETURN, "wrong format of names file '%s'", filename);
392 *local_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")))
421 Error(ERR_RETURN, "cannot append new player to names file '%s'",
425 for(i=0;i<MAX_NAMELEN;i++)
426 fputc(new_player.login_name[i],file);
427 for(i=0;i<MAX_NAMELEN;i++)
428 fputc(new_player.alias_name[i],file);
429 fputc(new_player.handicap,file);
430 fputc(new_player.setup / 256,file);
431 fputc(new_player.setup % 256,file);
432 fputc(new_player.leveldir_nr,file);
433 if (!version_10_file)
435 fputc(new_player.level_nr,file);
436 for(i=0;i<10;i++) /* currently unused bytes */
442 else /* prüfen, ob Spieler in Liste enthalten */
443 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
447 if (mode==PLAYER_SETUP)
449 *local_player = new_player;
450 if (local_player->leveldir_nr < num_leveldirs)
451 leveldir_nr = local_player->leveldir_nr;
457 local_player->handicap = new_player.handicap;
458 local_player->level_nr = new_player.level_nr;
461 level_nr = local_player->level_nr;
465 void SaveLevel(int level_nr)
468 char filename[MAX_FILENAME_LEN];
471 sprintf(filename,"%s/%s/%d",
472 level_directory,leveldir[leveldir_nr].filename,level_nr);
474 if (!(file=fopen(filename,"w")))
476 Error(ERR_RETURN, "cannot save level file '%s'", filename);
480 fputs(LEVEL_COOKIE,file); /* Formatkennung */
483 fputc(level.fieldx,file);
484 fputc(level.fieldy,file);
485 fputc(level.time / 256,file);
486 fputc(level.time % 256,file);
487 fputc(level.edelsteine / 256,file);
488 fputc(level.edelsteine % 256,file);
490 for(i=0;i<MAX_LEVNAMLEN;i++)
491 fputc(level.name[i],file);
492 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
493 fputc(level.score[i],file);
497 fputc(level.mampfer_inhalt[i][x][y],file);
498 fputc(level.tempo_amoebe,file);
499 fputc(level.dauer_sieb,file);
500 fputc(level.dauer_ablenk,file);
501 fputc(level.amoebe_inhalt,file);
503 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
506 for(y=0;y<lev_fieldy;y++)
507 for(x=0;x<lev_fieldx;x++)
508 fputc(Ur[x][y],file);
512 chmod(filename, LEVEL_PERMS);
515 void SaveLevelTape(int level_nr)
518 char filename[MAX_FILENAME_LEN];
520 BOOL new_tape = TRUE;
523 sprintf(filename,"%s/%s/%d.tape",
524 level_directory,leveldir[leveldir_nr].filename,level_nr);
526 sprintf(filename,"%s/%s/%d.tap",
527 level_directory,leveldir[leveldir_nr].filename,level_nr);
530 /* Testen, ob bereits eine Aufnahme existiert */
531 if ((file=fopen(filename,"r")))
536 if (!Request("Replace old tape ?",REQ_ASK))
540 if (!(file=fopen(filename,"w")))
542 Error(ERR_RETURN, "cannot save level recording file '%s'", filename);
546 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
549 fputc((tape.random_seed >> 24) & 0xff,file);
550 fputc((tape.random_seed >> 16) & 0xff,file);
551 fputc((tape.random_seed >> 8) & 0xff,file);
552 fputc((tape.random_seed >> 0) & 0xff,file);
554 fputc((tape.date >> 24) & 0xff,file);
555 fputc((tape.date >> 16) & 0xff,file);
556 fputc((tape.date >> 8) & 0xff,file);
557 fputc((tape.date >> 0) & 0xff,file);
559 fputc((tape.length >> 24) & 0xff,file);
560 fputc((tape.length >> 16) & 0xff,file);
561 fputc((tape.length >> 8) & 0xff,file);
562 fputc((tape.length >> 0) & 0xff,file);
564 for(i=0;i<tape.length;i++)
568 for(j=0; j<MAX_PLAYERS; j++)
569 fputc(tape.pos[i].action[j],file);
571 fputc(tape.pos[i].delay,file);
576 chmod(filename, LEVREC_PERMS);
578 tape.changed = FALSE;
581 Request("tape saved !",REQ_CONFIRM);
584 void SaveScore(int level_nr)
587 char filename[MAX_FILENAME_LEN];
590 sprintf(filename,"%s/%s/%s",
591 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
593 if (!(file=fopen(filename,"r+")))
595 Error(ERR_RETURN, "cannot save score for level %d", level_nr);
600 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
602 for(i=0;i<MAX_SCORE_ENTRIES;i++)
604 for(j=0;j<MAX_NAMELEN;j++)
605 fputc(highscore[i].Name[j],file);
606 fputc(highscore[i].Score / 256,file);
607 fputc(highscore[i].Score % 256,file);
612 void SavePlayerInfo(int mode)
615 char filename[MAX_FILENAME_LEN];
616 char cookie[MAX_FILENAME_LEN];
618 struct PlayerInfo default_player;
619 int version_10_file = FALSE;
621 if (mode==PLAYER_LEVEL)
622 sprintf(filename,"%s/%s/%s",
623 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
625 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
627 if (!(file = fopen(filename,"r+")))
629 Error(ERR_RETURN, "cannot save player information to file '%s'", filename);
633 fgets(cookie,NAMES_COOKIE_LEN,file);
634 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
635 version_10_file = TRUE;
636 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
638 Error(ERR_RETURN, "wrong format of names file '%s'", filename);
645 for(i=0;i<MAX_NAMELEN;i++)
646 default_player.login_name[i] = fgetc(file);
647 for(i=0;i<MAX_NAMELEN;i++)
648 default_player.alias_name[i] = fgetc(file);
649 default_player.handicap = fgetc(file);
650 default_player.setup = (fgetc(file)<<8) | fgetc(file);
651 default_player.leveldir_nr = fgetc(file);
652 if (!version_10_file)
654 default_player.level_nr = fgetc(file);
655 for(i=0;i<10;i++) /* currently unused bytes */
659 default_player.level_nr = default_player.handicap;
661 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
663 else /* prüfen, ob Spieler in Liste enthalten */
664 if (!strncmp(default_player.login_name,
665 local_player->login_name, MAX_NAMELEN-1))
667 fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
672 local_player->level_nr = level_nr;
674 for(i=0;i<MAX_NAMELEN;i++)
675 fputc(local_player->login_name[i],file);
676 for(i=0;i<MAX_NAMELEN;i++)
677 fputc(local_player->alias_name[i],file);
678 fputc(local_player->handicap,file);
679 fputc(local_player->setup / 256,file);
680 fputc(local_player->setup % 256,file);
681 fputc(local_player->leveldir_nr,file);
682 if (!version_10_file)
684 fputc(local_player->level_nr,file);
685 for(i=0;i<10;i++) /* currently unused bytes */
692 void LoadJoystickData()
698 if (joystick_status==JOYSTICK_OFF)
702 if (!(file=fopen(JOYDAT_FILE,"r")))
705 fscanf(file,"%s",cookie);
706 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
708 Error(ERR_RETURN, "wrong format of joystick file '%s'", JOYDAT_FILE);
715 fscanf(file,"%s",cookie);
716 fscanf(file, "%d %d %d \n",
717 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
718 fscanf(file, "%d %d %d \n",
719 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
725 load_joystick_data(JOYDAT_FILE);
729 void SaveJoystickData()
734 if (joystick_status==JOYSTICK_OFF)
740 if (!(file=fopen(JOYDAT_FILE,"w")))
742 Error(ERR_RETURN, "cannot save joystick calibration data to file '%s'",
747 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
750 fprintf(file,"JOYSTICK_%d_DATA\n",i);
751 fprintf(file, "%d %d %d \n",
752 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
753 fprintf(file, "%d %d %d \n",
754 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
758 chmod(JOYDAT_FILE, JOYDAT_PERMS);
760 save_joystick_data(JOYDAT_FILE);