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 for(i=0;i<MAX_SC_ENTRIES;i++)
159 level.score[i] = fgetc(file);
160 level.amoebe_inhalt = 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);
169 for(i=0;i<19;i++) /* Rest reserviert / Headergröße 80 Bytes */
172 for(y=0;y<MAX_LEV_FIELDY;y++)
173 for(x=0;x<MAX_LEV_FIELDX;x++)
174 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
176 for(y=0;y<lev_fieldy;y++)
177 for(x=0;x<lev_fieldx;x++)
178 Feld[x][y] = Ur[x][y] = fgetc(file);
182 if (level.time<=10) /* Mindestspieldauer */
187 lev_fieldx = level.fieldx = STD_LEV_FIELDX;
188 lev_fieldy = level.fieldy = STD_LEV_FIELDY;
191 level.edelsteine = 0;
192 strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
193 for(i=0;i<MAX_SC_ENTRIES;i++)
195 level.amoebe_inhalt = EL_DIAMANT;
199 level.mampfer_inhalt[i][x][y] = EL_FELSBROCKEN;
200 level.tempo_amoebe = 10;
201 level.dauer_sieb = 10;
202 level.dauer_ablenk = 10;
204 for(y=0;y<STD_LEV_FIELDY;y++)
205 for(x=0;x<STD_LEV_FIELDX;x++)
206 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
207 Feld[0][0] = Ur[0][0] = EL_SPIELFIGUR;
208 Feld[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
209 Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_AUSGANG_ZU;
213 void LoadLevelTape(int level_nr)
216 char filename[MAX_FILENAME];
217 char cookie[MAX_FILENAME];
220 sprintf(filename,"%s/%s/%d.tape",
221 LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
223 if ((file=fopen(filename,"r")))
225 fgets(cookie,LEVELREC_COOKIE_LEN,file);
227 if (strcmp(cookie,LEVELREC_COOKIE)) /* ungültiges Format? */
229 fprintf(stderr,"%s: wrong format of level recording file '%s'!\n",
240 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
242 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
244 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
246 tape.level_nr = level_nr;
248 tape.recording = FALSE;
249 tape.playing = FALSE;
250 tape.pausing = FALSE;
252 for(i=0;i<tape.length;i++)
256 tape.pos[i].joystickdata = fgetc(file);
257 tape.pos[i].delay = fgetc(file);
262 if (i != tape.length)
263 fprintf(stderr,"%s: level recording file '%s' corrupted!\n",
271 void LoadScore(int level_nr)
274 char filename[MAX_FILENAME];
275 char cookie[MAX_FILENAME];
278 sprintf(filename,"%s/%s/%s",
279 SCORE_PATH,leveldir[leveldir_nr].filename,SCORE_FILENAME);
281 if (!(file=fopen(filename,"r")))
283 if (!CreateNewScoreFile())
285 fprintf(stderr,"%s: cannot create score file '%s'!\n",
288 else if (!(file=fopen(filename,"r")))
290 fprintf(stderr,"%s: cannot load score for level %d!\n",
297 fgets(cookie,SCORE_COOKIE_LEN,file);
298 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
300 fprintf(stderr,"%s: wrong format of score file!\n",progname);
309 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
311 for(i=0;i<MAX_SCORE_ENTRIES;i++)
313 for(j=0;j<MAX_NAMELEN;j++)
314 highscore[i].Name[j] = fgetc(file);
315 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
321 for(i=0;i<MAX_SCORE_ENTRIES;i++)
323 strcpy(highscore[i].Name,EMPTY_ALIAS);
324 highscore[i].Score = 0;
329 void LoadPlayerInfo(int mode)
332 char filename[MAX_FILENAME];
333 char cookie[MAX_FILENAME];
335 char *login_name = GetLoginName();
336 struct PlayerInfo default_player, new_player;
338 if (mode==PLAYER_LEVEL)
339 sprintf(filename,"%s/%s/%s",
340 NAMES_PATH,leveldir[leveldir_nr].filename,NAMES_FILENAME);
342 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
344 for(i=0;i<MAX_NAMELEN;i++)
345 default_player.login_name[i] = default_player.alias_name[i] = 0;
346 strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
347 strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
348 default_player.handicap = 0;
349 default_player.setup = DEFAULT_SETUP;
350 default_player.leveldir_nr = 0;
352 new_player = default_player;
354 if (!(file=fopen(filename,"r")))
356 if (!CreateNewNamesFile(mode))
358 fprintf(stderr,"%s: cannot create names file '%s'!\n",
361 else if (!(file=fopen(filename,"r")))
363 fprintf(stderr,"%s: cannot load player information '%s'!\n",
370 fgets(cookie,NAMES_COOKIE_LEN,file);
371 if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
373 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
382 player = default_player;
383 level_nr = default_player.handicap;
389 for(i=0;i<MAX_NAMELEN;i++)
390 new_player.login_name[i] = fgetc(file);
391 for(i=0;i<MAX_NAMELEN;i++)
392 new_player.alias_name[i] = fgetc(file);
393 new_player.handicap = fgetc(file);
394 new_player.setup = (fgetc(file)<<8) | fgetc(file);
395 new_player.leveldir_nr = fgetc(file);
397 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
399 new_player = default_player;
402 if (!(file=fopen(filename,"a")))
404 fprintf(stderr,"%s: cannot append new player to names file '%s'!\n",
409 for(i=0;i<MAX_NAMELEN;i++)
410 fputc(new_player.login_name[i],file);
411 for(i=0;i<MAX_NAMELEN;i++)
412 fputc(new_player.alias_name[i],file);
413 fputc(new_player.handicap,file);
414 fputc(new_player.setup / 256,file);
415 fputc(new_player.setup % 256,file);
416 fputc(new_player.leveldir_nr,file);
420 else /* prüfen, ob Spieler in Liste enthalten */
421 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
425 if (mode==PLAYER_SETUP)
428 if (player.leveldir_nr < num_leveldirs)
429 leveldir_nr = player.leveldir_nr;
434 player.handicap = new_player.handicap;
436 level_nr = player.handicap;
440 void SaveLevel(int level_nr)
443 char filename[MAX_FILENAME];
446 sprintf(filename,"%s/%s/%d",
447 LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
449 if (!(file=fopen(filename,"w")))
451 fprintf(stderr,"%s: cannot save level file '%s'!\n",progname,filename);
455 fputs(LEVEL_COOKIE,file); /* Formatkennung */
458 fputc(level.fieldx,file);
459 fputc(level.fieldy,file);
460 fputc(level.time / 256,file);
461 fputc(level.time % 256,file);
462 fputc(level.edelsteine / 256,file);
463 fputc(level.edelsteine % 256,file);
465 for(i=0;i<MAX_LEVNAMLEN;i++)
466 fputc(level.name[i],file);
467 for(i=0;i<MAX_SC_ENTRIES;i++)
468 fputc(level.score[i],file);
469 fputc(level.amoebe_inhalt,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);
478 for(i=0;i<19;i++) /* Rest reserviert / Headergröße 80 Bytes */
481 for(y=0;y<lev_fieldy;y++)
482 for(x=0;x<lev_fieldx;x++)
483 fputc(Ur[x][y],file);
487 chmod(filename, LEVEL_PERMS);
490 void SaveLevelTape(int level_nr)
493 char filename[MAX_FILENAME];
495 BOOL new_tape = TRUE;
497 sprintf(filename,"%s/%s/%d.tape",
498 LEVEL_PATH,leveldir[leveldir_nr].filename,level_nr);
500 /* Testen, ob bereits eine Aufnahme existiert */
501 if ((file=fopen(filename,"r")))
506 if (!AreYouSure("Replace old tape ?",AYS_ASK))
510 if (!(file=fopen(filename,"w")))
512 fprintf(stderr,"%s: cannot save level recording file '%s'!\n",
517 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
522 fputc((tape.random_seed >> 24) & 0xff,file);
523 fputc((tape.random_seed >> 16) & 0xff,file);
524 fputc((tape.random_seed >> 8) & 0xff,file);
525 fputc((tape.random_seed >> 0) & 0xff,file);
527 fputc((tape.date >> 24) & 0xff,file);
528 fputc((tape.date >> 16) & 0xff,file);
529 fputc((tape.date >> 8) & 0xff,file);
530 fputc((tape.date >> 0) & 0xff,file);
532 fputc((tape.length >> 24) & 0xff,file);
533 fputc((tape.length >> 16) & 0xff,file);
534 fputc((tape.length >> 8) & 0xff,file);
535 fputc((tape.length >> 0) & 0xff,file);
537 for(i=0;i<tape.length;i++)
539 fputc(tape.pos[i].joystickdata,file);
540 fputc(tape.pos[i].delay,file);
545 chmod(filename, LEVREC_PERMS);
548 AreYouSure("tape saved !",AYS_CONFIRM);
551 void SaveScore(int level_nr)
554 char filename[MAX_FILENAME];
557 sprintf(filename,"%s/%s/%s",
558 SCORE_PATH,leveldir[leveldir_nr].filename,SCORE_FILENAME);
560 if (!(file=fopen(filename,"r+")))
562 fprintf(stderr,"%s: cannot save score for level %d!\n",
568 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
570 for(i=0;i<MAX_SCORE_ENTRIES;i++)
572 for(j=0;j<MAX_NAMELEN;j++)
573 fputc(highscore[i].Name[j],file);
574 fputc(highscore[i].Score / 256,file);
575 fputc(highscore[i].Score % 256,file);
580 void SavePlayerInfo(int mode)
583 char filename[MAX_FILENAME];
584 char cookie[MAX_FILENAME];
586 struct PlayerInfo default_player;
588 if (mode==PLAYER_LEVEL)
589 sprintf(filename,"%s/%s/%s",
590 NAMES_PATH,leveldir[leveldir_nr].filename,NAMES_FILENAME);
592 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
594 if (!(file=fopen(filename,"r+")))
596 fprintf(stderr,"%s: cannot save player information '%s'!\n",
601 fgets(cookie,NAMES_COOKIE_LEN,file);
602 if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
604 fprintf(stderr,"%s: wrong format of names file '%s'!\n",
612 for(i=0;i<MAX_NAMELEN;i++)
613 default_player.login_name[i] = fgetc(file);
614 for(i=0;i<MAX_NAMELEN;i++)
615 default_player.alias_name[i] = fgetc(file);
616 default_player.handicap = fgetc(file);
617 default_player.setup = (fgetc(file)<<8) | fgetc(file);
618 default_player.leveldir_nr = fgetc(file);
620 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
622 else /* prüfen, ob Spieler in Liste enthalten */
623 if (!strncmp(default_player.login_name,player.login_name,MAX_NAMELEN-1))
625 fseek(file,-(2*MAX_NAMELEN+1+2+1),SEEK_CUR);
630 for(i=0;i<MAX_NAMELEN;i++)
631 fputc(player.login_name[i],file);
632 for(i=0;i<MAX_NAMELEN;i++)
633 fputc(player.alias_name[i],file);
634 fputc(player.handicap,file);
635 fputc(player.setup / 256,file);
636 fputc(player.setup % 256,file);
637 fputc(player.leveldir_nr,file);
642 void LoadJoystickData()
648 if (joystick_status==JOYSTICK_OFF)
651 if (!(file=fopen(JOYDAT_FILE,"r")))
654 fscanf(file,"%s",cookie);
655 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
657 fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
664 fscanf(file,"%s",cookie);
665 fscanf(file, "%d %d %d \n",
666 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
667 fscanf(file, "%d %d %d \n",
668 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
675 void SaveJoystickData()
680 if (joystick_status==JOYSTICK_OFF)
685 if (!(file=fopen(JOYDAT_FILE,"w")))
687 fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
691 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
694 fprintf(file,"JOYSTICK_%d_DATA\n",i);
695 fprintf(file, "%d %d %d \n",
696 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
697 fprintf(file, "%d %d %d \n",
698 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
702 chmod(JOYDAT_FILE, JOYDAT_PERMS);