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 ***********************************************************/
19 BOOL CreateNewScoreFile()
22 char filename[MAX_FILENAME];
23 char empty_alias[MAX_NAMELEN];
26 sprintf(filename,"%s/%s/%s",
27 SCORE_PATH,leveldir[leveldir_nr].filename,SCORE_FILENAME);
29 if (!(file=fopen(filename,"w")))
32 for(i=0;i<MAX_NAMELEN;i++)
34 strncpy(empty_alias,EMPTY_ALIAS,MAX_NAMELEN-1);
36 fputs(SCORE_COOKIE,file); /* Formatkennung */
37 for(i=0;i<LEVELDIR_SIZE(leveldir[leveldir_nr]);i++)
39 for(j=0;j<MAX_SCORE_ENTRIES;j++)
41 for(k=0;k<MAX_NAMELEN;k++)
42 fputc(empty_alias[k],file);
49 chmod(filename, SCORE_PERMS);
53 BOOL CreateNewNamesFile(int mode)
55 char filename[MAX_FILENAME];
58 if (mode==PLAYER_LEVEL)
59 sprintf(filename,"%s/%s/%s",
60 NAMES_PATH,leveldir[leveldir_nr].filename,NAMES_FILENAME);
62 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
64 if (!(file=fopen(filename,"w")))
67 fputs(NAMES_COOKIE,file); /* Formatkennung */
70 chmod(filename, NAMES_PERMS);
77 char filename[MAX_FILENAME];
78 char cookie[MAX_FILENAME];
81 sprintf(filename,"%s/%s",LEVEL_PATH,LEVDIR_FILENAME);
83 if (!(file=fopen(filename,"r")))
85 fprintf(stderr,"%s: cannot load level info '%s'!\n",progname,filename);
89 fscanf(file,"%s\n",cookie);
90 if (strcmp(cookie,LEVELDIR_COOKIE)) /* ungültiges Format? */
92 fprintf(stderr,"%s: wrong format of level info file!\n",progname);
99 for(i=0;i<MAX_LEVDIR_ENTRIES;i++)
101 fscanf(file,"%s",leveldir[i].filename);
102 fscanf(file,"%s",leveldir[i].name);
103 fscanf(file,"%d",&leveldir[i].num_ready);
104 fscanf(file,"%d",&leveldir[i].num_free);
113 fprintf(stderr,"%s: empty level info '%s'!\n",progname,filename);
120 void LoadLevel(int level_nr)
123 char filename[MAX_FILENAME];
124 char cookie[MAX_FILENAME];
127 sprintf(filename,"%s/%s/%d",
128 LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
130 if (!(file=fopen(filename,"r")))
133 fprintf(stderr,"%s: cannot load level '%s'!\n",progname,filename);
138 fgets(cookie,LEVEL_COOKIE_LEN,file);
140 if (strcmp(cookie,LEVEL_COOKIE)) /* ungültiges Format? */
142 fprintf(stderr,"%s: wrong format of level file '%s'!\n",
151 lev_fieldx = level.fieldx = fgetc(file);
152 lev_fieldy = level.fieldy = fgetc(file);
154 level.time = (fgetc(file)<<8) | fgetc(file);
155 level.edelsteine = (fgetc(file)<<8) | fgetc(file);
156 for(i=0;i<MAX_LEVNAMLEN;i++)
157 level.name[i] = fgetc(file);
158 level.name[MAX_LEVNAMLEN-1] = 0;
159 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
160 level.score[i] = fgetc(file);
164 level.mampfer_inhalt[i][x][y] = fgetc(file);
165 level.tempo_amoebe = fgetc(file);
166 level.dauer_sieb = fgetc(file);
167 level.dauer_ablenk = fgetc(file);
168 level.amoebe_inhalt = fgetc(file);
170 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
173 for(y=0;y<MAX_LEV_FIELDY;y++)
174 for(x=0;x<MAX_LEV_FIELDX;x++)
175 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
177 for(y=0;y<lev_fieldy;y++)
178 for(x=0;x<lev_fieldx;x++)
179 Feld[x][y] = Ur[x][y] = fgetc(file);
183 if (level.time<=10) /* Mindestspieldauer */
188 lev_fieldx = level.fieldx = STD_LEV_FIELDX;
189 lev_fieldy = level.fieldy = STD_LEV_FIELDY;
192 level.edelsteine = 0;
193 strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
194 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
199 level.mampfer_inhalt[i][x][y] = EL_FELSBROCKEN;
200 level.tempo_amoebe = 10;
201 level.dauer_sieb = 10;
202 level.dauer_ablenk = 10;
203 level.amoebe_inhalt = EL_DIAMANT;
205 for(y=0;y<STD_LEV_FIELDY;y++)
206 for(x=0;x<STD_LEV_FIELDX;x++)
207 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
208 Feld[0][0] = Ur[0][0] = EL_SPIELFIGUR;
209 Feld[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
210 Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_AUSGANG_ZU;
214 void LoadLevelTape(int level_nr)
217 char filename[MAX_FILENAME];
218 char cookie[MAX_FILENAME];
221 sprintf(filename,"%s/%s/%d.tape",
222 LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
224 if ((file=fopen(filename,"r")))
226 fgets(cookie,LEVELREC_COOKIE_LEN,file);
228 if (strcmp(cookie,LEVELREC_COOKIE)) /* ungültiges Format? */
230 fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
241 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
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 tape.level_nr = level_nr;
249 tape.recording = FALSE;
250 tape.playing = FALSE;
251 tape.pausing = FALSE;
253 for(i=0;i<tape.length;i++)
257 tape.pos[i].joystickdata = fgetc(file);
258 tape.pos[i].delay = fgetc(file);
263 if (i != tape.length)
264 fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
272 void LoadScore(int level_nr)
275 char filename[MAX_FILENAME];
276 char cookie[MAX_FILENAME];
279 sprintf(filename,"%s/%s/%s",
280 SCORE_PATH,leveldir[leveldir_nr].filename,SCORE_FILENAME);
282 if (!(file=fopen(filename,"r")))
284 if (!CreateNewScoreFile())
286 fprintf(stderr,"%s: cannot create score file '%s'!\n",
289 else if (!(file=fopen(filename,"r")))
291 fprintf(stderr,"%s: cannot load score for level %d!\n",
298 fgets(cookie,SCORE_COOKIE_LEN,file);
299 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
301 fprintf(stderr,"%s: wrong format of score file!\n",progname);
310 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
312 for(i=0;i<MAX_SCORE_ENTRIES;i++)
314 for(j=0;j<MAX_NAMELEN;j++)
315 highscore[i].Name[j] = fgetc(file);
316 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
322 for(i=0;i<MAX_SCORE_ENTRIES;i++)
324 strcpy(highscore[i].Name,EMPTY_ALIAS);
325 highscore[i].Score = 0;
330 void LoadPlayerInfo(int mode)
333 char filename[MAX_FILENAME];
334 char cookie[MAX_FILENAME];
336 char *login_name = GetLoginName();
337 struct PlayerInfo default_player, new_player;
339 if (mode==PLAYER_LEVEL)
340 sprintf(filename,"%s/%s/%s",
341 NAMES_PATH,leveldir[leveldir_nr].filename,NAMES_FILENAME);
343 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
345 for(i=0;i<MAX_NAMELEN;i++)
346 default_player.login_name[i] = default_player.alias_name[i] = 0;
347 strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
348 strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
349 default_player.handicap = 0;
350 default_player.setup = DEFAULT_SETUP;
351 default_player.leveldir_nr = 0;
353 new_player = default_player;
355 if (!(file=fopen(filename,"r")))
357 if (!CreateNewNamesFile(mode))
359 fprintf(stderr,"%s: cannot create names file '%s'!\n",
362 else if (!(file=fopen(filename,"r")))
364 fprintf(stderr,"%s: cannot load player information '%s'!\n",
371 fgets(cookie,NAMES_COOKIE_LEN,file);
372 if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
374 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
383 player = default_player;
384 level_nr = default_player.handicap;
390 for(i=0;i<MAX_NAMELEN;i++)
391 new_player.login_name[i] = fgetc(file);
392 for(i=0;i<MAX_NAMELEN;i++)
393 new_player.alias_name[i] = fgetc(file);
394 new_player.handicap = fgetc(file);
395 new_player.setup = (fgetc(file)<<8) | fgetc(file);
396 new_player.leveldir_nr = fgetc(file);
398 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
400 new_player = default_player;
403 if (!(file=fopen(filename,"a")))
405 fprintf(stderr,"%s: cannot append new player to names file '%s'!\n",
410 for(i=0;i<MAX_NAMELEN;i++)
411 fputc(new_player.login_name[i],file);
412 for(i=0;i<MAX_NAMELEN;i++)
413 fputc(new_player.alias_name[i],file);
414 fputc(new_player.handicap,file);
415 fputc(new_player.setup / 256,file);
416 fputc(new_player.setup % 256,file);
417 fputc(new_player.leveldir_nr,file);
421 else /* prüfen, ob Spieler in Liste enthalten */
422 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
426 if (mode==PLAYER_SETUP)
429 if (player.leveldir_nr < num_leveldirs)
430 leveldir_nr = player.leveldir_nr;
435 player.handicap = new_player.handicap;
437 level_nr = player.handicap;
441 void SaveLevel(int level_nr)
444 char filename[MAX_FILENAME];
447 sprintf(filename,"%s/%s/%d",
448 LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
450 if (!(file=fopen(filename,"w")))
452 fprintf(stderr,"%s: cannot save level file '%s'!\n",progname,filename);
456 fputs(LEVEL_COOKIE,file); /* Formatkennung */
459 fputc(level.fieldx,file);
460 fputc(level.fieldy,file);
461 fputc(level.time / 256,file);
462 fputc(level.time % 256,file);
463 fputc(level.edelsteine / 256,file);
464 fputc(level.edelsteine % 256,file);
466 for(i=0;i<MAX_LEVNAMLEN;i++)
467 fputc(level.name[i],file);
468 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
469 fputc(level.score[i],file);
473 fputc(level.mampfer_inhalt[i][x][y],file);
474 fputc(level.tempo_amoebe,file);
475 fputc(level.dauer_sieb,file);
476 fputc(level.dauer_ablenk,file);
477 fputc(level.amoebe_inhalt,file);
479 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
482 for(y=0;y<lev_fieldy;y++)
483 for(x=0;x<lev_fieldx;x++)
484 fputc(Ur[x][y],file);
488 chmod(filename, LEVEL_PERMS);
491 void SaveLevelTape(int level_nr)
494 char filename[MAX_FILENAME];
496 BOOL new_tape = TRUE;
498 sprintf(filename,"%s/%s/%d.tape",
499 LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
501 /* Testen, ob bereits eine Aufnahme existiert */
502 if ((file=fopen(filename,"r")))
507 if (!AreYouSure("Replace old tape ?",AYS_ASK))
511 if (!(file=fopen(filename,"w")))
513 fprintf(stderr,"%s: cannot save level recording file '%s'!\n",
518 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
523 fputc((tape.random_seed >> 24) & 0xff,file);
524 fputc((tape.random_seed >> 16) & 0xff,file);
525 fputc((tape.random_seed >> 8) & 0xff,file);
526 fputc((tape.random_seed >> 0) & 0xff,file);
528 fputc((tape.date >> 24) & 0xff,file);
529 fputc((tape.date >> 16) & 0xff,file);
530 fputc((tape.date >> 8) & 0xff,file);
531 fputc((tape.date >> 0) & 0xff,file);
533 fputc((tape.length >> 24) & 0xff,file);
534 fputc((tape.length >> 16) & 0xff,file);
535 fputc((tape.length >> 8) & 0xff,file);
536 fputc((tape.length >> 0) & 0xff,file);
538 for(i=0;i<tape.length;i++)
540 fputc(tape.pos[i].joystickdata,file);
541 fputc(tape.pos[i].delay,file);
546 chmod(filename, LEVREC_PERMS);
549 AreYouSure("tape saved !",AYS_CONFIRM);
552 void SaveScore(int level_nr)
555 char filename[MAX_FILENAME];
558 sprintf(filename,"%s/%s/%s",
559 SCORE_PATH,leveldir[leveldir_nr].filename,SCORE_FILENAME);
561 if (!(file=fopen(filename,"r+")))
563 fprintf(stderr,"%s: cannot save score for level %d!\n",
569 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
571 for(i=0;i<MAX_SCORE_ENTRIES;i++)
573 for(j=0;j<MAX_NAMELEN;j++)
574 fputc(highscore[i].Name[j],file);
575 fputc(highscore[i].Score / 256,file);
576 fputc(highscore[i].Score % 256,file);
581 void SavePlayerInfo(int mode)
584 char filename[MAX_FILENAME];
585 char cookie[MAX_FILENAME];
587 struct PlayerInfo default_player;
589 if (mode==PLAYER_LEVEL)
590 sprintf(filename,"%s/%s/%s",
591 NAMES_PATH,leveldir[leveldir_nr].filename,NAMES_FILENAME);
593 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
595 if (!(file=fopen(filename,"r+")))
597 fprintf(stderr,"%s: cannot save player information '%s'!\n",
602 fgets(cookie,NAMES_COOKIE_LEN,file);
603 if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
605 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
613 for(i=0;i<MAX_NAMELEN;i++)
614 default_player.login_name[i] = fgetc(file);
615 for(i=0;i<MAX_NAMELEN;i++)
616 default_player.alias_name[i] = fgetc(file);
617 default_player.handicap = fgetc(file);
618 default_player.setup = (fgetc(file)<<8) | fgetc(file);
619 default_player.leveldir_nr = fgetc(file);
621 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
623 else /* prüfen, ob Spieler in Liste enthalten */
624 if (!strncmp(default_player.login_name,player.login_name,MAX_NAMELEN-1))
626 fseek(file,-(2*MAX_NAMELEN+1+2+1),SEEK_CUR);
631 for(i=0;i<MAX_NAMELEN;i++)
632 fputc(player.login_name[i],file);
633 for(i=0;i<MAX_NAMELEN;i++)
634 fputc(player.alias_name[i],file);
635 fputc(player.handicap,file);
636 fputc(player.setup / 256,file);
637 fputc(player.setup % 256,file);
638 fputc(player.leveldir_nr,file);
643 void LoadJoystickData()
649 if (joystick_status==JOYSTICK_OFF)
652 if (!(file=fopen(JOYDAT_FILE,"r")))
655 fscanf(file,"%s",cookie);
656 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
658 fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
665 fscanf(file,"%s",cookie);
666 fscanf(file, "%d %d %d \n",
667 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
668 fscanf(file, "%d %d %d \n",
669 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
676 void SaveJoystickData()
681 if (joystick_status==JOYSTICK_OFF)
686 if (!(file=fopen(JOYDAT_FILE,"w")))
688 fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
692 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
695 fprintf(file,"JOYSTICK_%d_DATA\n",i);
696 fprintf(file, "%d %d %d \n",
697 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
698 fprintf(file, "%d %d %d \n",
699 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
703 chmod(JOYDAT_FILE, JOYDAT_PERMS);