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 ***********************************************************/
22 boolean CreateNewScoreFile()
25 char filename[MAX_FILENAME_LEN];
26 char empty_alias[MAX_NAMELEN];
29 sprintf(filename,"%s/%s/%s",
30 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
32 if (!(file=fopen(filename,"w")))
35 for(i=0;i<MAX_NAMELEN;i++)
37 strncpy(empty_alias,EMPTY_ALIAS,MAX_NAMELEN-1);
39 fputs(SCORE_COOKIE,file); /* Formatkennung */
40 for(i=0;i<leveldir[leveldir_nr].levels;i++)
42 for(j=0;j<MAX_SCORE_ENTRIES;j++)
44 for(k=0;k<MAX_NAMELEN;k++)
45 fputc(empty_alias[k],file);
52 chmod(filename, SCORE_PERMS);
56 boolean CreateNewNamesFile(int mode)
58 char filename[MAX_FILENAME_LEN];
61 if (mode==PLAYER_LEVEL)
62 sprintf(filename,"%s/%s/%s",
63 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
65 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
67 if (!(file=fopen(filename,"w")))
70 fputs(NAMES_COOKIE,file); /* Formatkennung */
73 chmod(filename, NAMES_PERMS);
77 boolean LoadLevelInfo()
80 char filename[MAX_FILENAME_LEN];
81 char cookie[MAX_FILENAME_LEN];
84 sprintf(filename,"%s/%s",level_directory,LEVDIR_FILENAME);
86 if (!(file=fopen(filename,"r")))
88 Error(ERR_RETURN, "cannot read level info '%s'", filename);
92 fscanf(file,"%s\n",cookie);
93 if (strcmp(cookie,LEVELDIR_COOKIE)) /* ungültiges Format? */
95 Error(ERR_RETURN, "wrong format of level info file");
102 for(i=0;i<MAX_LEVDIR_ENTRIES;i++)
104 fscanf(file,"%s",leveldir[i].filename);
105 fscanf(file,"%s",leveldir[i].name);
106 fscanf(file,"%d",&leveldir[i].levels);
107 fscanf(file,"%d",&leveldir[i].readonly);
116 Error(ERR_RETURN, "empty level info '%s'", filename);
123 void LoadLevel(int level_nr)
126 char filename[MAX_FILENAME_LEN];
127 char cookie[MAX_FILENAME_LEN];
130 sprintf(filename,"%s/%s/%d",
131 level_directory,leveldir[leveldir_nr].filename,level_nr);
133 if (!(file = fopen(filename,"r")))
134 Error(ERR_RETURN, "cannot read level '%s' - creating new level", filename);
137 fgets(cookie,LEVEL_COOKIE_LEN,file);
140 if (strcmp(cookie,LEVEL_COOKIE)) /* ungültiges Format? */
142 Error(ERR_RETURN, "wrong format of level file '%s'", filename);
150 lev_fieldx = level.fieldx = fgetc(file);
151 lev_fieldy = level.fieldy = fgetc(file);
153 level.time = (fgetc(file)<<8) | fgetc(file);
154 level.edelsteine = (fgetc(file)<<8) | fgetc(file);
155 for(i=0;i<MAX_LEVNAMLEN;i++)
156 level.name[i] = fgetc(file);
157 level.name[MAX_LEVNAMLEN-1] = 0;
158 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
159 level.score[i] = fgetc(file);
163 level.mampfer_inhalt[i][x][y] = fgetc(file);
164 level.tempo_amoebe = fgetc(file);
165 level.dauer_sieb = fgetc(file);
166 level.dauer_ablenk = fgetc(file);
167 level.amoebe_inhalt = fgetc(file);
169 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / 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_LEVSCORE_ENTRIES;i++)
198 level.mampfer_inhalt[i][x][y] = EL_FELSBROCKEN;
199 level.tempo_amoebe = 10;
200 level.dauer_sieb = 10;
201 level.dauer_ablenk = 10;
202 level.amoebe_inhalt = EL_DIAMANT;
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_LEN];
217 char cookie[MAX_FILENAME_LEN];
219 boolean levelrec_10 = FALSE;
222 sprintf(filename,"%s/%s/%d.tape",
223 level_directory,leveldir[leveldir_nr].filename,level_nr);
225 sprintf(filename,"%s/%s/%d.tap",
226 level_directory,leveldir[leveldir_nr].filename,level_nr);
229 if ((file=fopen(filename,"r")))
231 fgets(cookie,LEVELREC_COOKIE_LEN,file);
233 if (!strcmp(cookie,LEVELREC_COOKIE_10)) /* old 1.0 tape format */
235 else if (strcmp(cookie,LEVELREC_COOKIE)) /* unknown tape format */
237 Error(ERR_RETURN, "wrong format of level recording file '%s'", filename);
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 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
253 tape.level_nr = level_nr;
255 tape.changed = FALSE;
257 tape.recording = FALSE;
258 tape.playing = FALSE;
259 tape.pausing = FALSE;
261 for(i=0;i<tape.length;i++)
265 if (i >= MAX_TAPELEN)
268 for(j=0; j<MAX_PLAYERS; j++)
270 if (levelrec_10 && j>0)
272 tape.pos[i].action[j] = MV_NO_MOVING;
275 tape.pos[i].action[j] = fgetc(file);
278 tape.pos[i].delay = fgetc(file);
286 if (i != tape.length)
287 Error(ERR_RETURN, "level recording file '%s' corrupted", filename);
289 tape.length_seconds = GetTapeLength();
292 void LoadScore(int level_nr)
295 char filename[MAX_FILENAME_LEN];
296 char cookie[MAX_FILENAME_LEN];
299 sprintf(filename,"%s/%s/%s",
300 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
302 if (!(file = fopen(filename,"r")))
304 if (!CreateNewScoreFile())
305 Error(ERR_RETURN, "cannot create score file '%s'", filename);
306 else if (!(file = fopen(filename,"r")))
307 Error(ERR_RETURN, "cannot read score for level %d", level_nr);
312 fgets(cookie,SCORE_COOKIE_LEN,file);
313 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
315 Error(ERR_RETURN, "wrong format of score file '%s'", filename);
324 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
326 for(i=0;i<MAX_SCORE_ENTRIES;i++)
328 for(j=0;j<MAX_NAMELEN;j++)
329 highscore[i].Name[j] = fgetc(file);
330 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
336 for(i=0;i<MAX_SCORE_ENTRIES;i++)
338 strcpy(highscore[i].Name,EMPTY_ALIAS);
339 highscore[i].Score = 0;
344 void LoadPlayerInfo(int mode)
347 char filename[MAX_FILENAME_LEN];
348 char cookie[MAX_FILENAME_LEN];
350 char *login_name = GetLoginName();
351 struct PlayerInfo default_player, new_player;
352 int version_10_file = FALSE;
354 if (mode==PLAYER_LEVEL)
355 sprintf(filename,"%s/%s/%s",
356 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
358 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
360 for(i=0;i<MAX_NAMELEN;i++)
361 default_player.login_name[i] = default_player.alias_name[i] = 0;
362 strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
363 strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
364 default_player.handicap = 0;
365 default_player.setup = DEFAULT_SETUP;
366 default_player.leveldir_nr = 0;
367 default_player.level_nr = 0;
369 new_player = default_player;
371 if (!(file = fopen(filename,"r")))
373 if (!CreateNewNamesFile(mode))
374 Error(ERR_RETURN, "cannot create names file '%s'", filename);
375 else if (!(file = fopen(filename,"r")))
376 Error(ERR_RETURN, "cannot read player information file '%s'", filename);
381 fgets(cookie,NAMES_COOKIE_LEN,file);
382 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
383 version_10_file = TRUE;
384 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
386 Error(ERR_RETURN, "wrong format of names file '%s'", filename);
394 *local_player = default_player;
395 level_nr = default_player.level_nr;
401 for(i=0;i<MAX_NAMELEN;i++)
402 new_player.login_name[i] = fgetc(file);
403 for(i=0;i<MAX_NAMELEN;i++)
404 new_player.alias_name[i] = fgetc(file);
405 new_player.handicap = fgetc(file);
406 new_player.setup = (fgetc(file)<<8) | fgetc(file);
407 new_player.leveldir_nr = fgetc(file);
408 if (!version_10_file)
410 new_player.level_nr = fgetc(file);
411 for(i=0;i<10;i++) /* currently unused bytes */
415 new_player.level_nr = new_player.handicap;
417 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
419 new_player = default_player;
422 if (!(file = fopen(filename,"a")))
423 Error(ERR_RETURN, "cannot append new player to names file '%s'",
427 for(i=0;i<MAX_NAMELEN;i++)
428 fputc(new_player.login_name[i],file);
429 for(i=0;i<MAX_NAMELEN;i++)
430 fputc(new_player.alias_name[i],file);
431 fputc(new_player.handicap,file);
432 fputc(new_player.setup / 256,file);
433 fputc(new_player.setup % 256,file);
434 fputc(new_player.leveldir_nr,file);
435 if (!version_10_file)
437 fputc(new_player.level_nr,file);
438 for(i=0;i<10;i++) /* currently unused bytes */
444 else /* prüfen, ob Spieler in Liste enthalten */
445 if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
449 if (mode==PLAYER_SETUP)
451 *local_player = new_player;
452 if (local_player->leveldir_nr < num_leveldirs)
453 leveldir_nr = local_player->leveldir_nr;
459 local_player->handicap = new_player.handicap;
460 local_player->level_nr = new_player.level_nr;
463 level_nr = local_player->level_nr;
469 void SaveLevel(int level_nr)
472 char filename[MAX_FILENAME_LEN];
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_LEN];
524 boolean 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 (!Request("Replace old tape ?",REQ_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].action[j],file);
575 fputc(tape.pos[i].delay,file);
580 chmod(filename, LEVREC_PERMS);
582 tape.changed = FALSE;
585 Request("tape saved !",REQ_CONFIRM);
588 void SaveScore(int level_nr)
591 char filename[MAX_FILENAME_LEN];
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_LEN];
620 char cookie[MAX_FILENAME_LEN];
622 struct PlayerInfo default_player;
623 int version_10_file = FALSE;
627 if (mode == PLAYER_SETUP)
632 if (mode == PLAYER_LEVEL)
633 sprintf(filename,"%s/%s/%s",
634 level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
636 sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
638 if (!(file = fopen(filename,"r+")))
640 Error(ERR_RETURN, "cannot save player information to file '%s'", filename);
644 fgets(cookie,NAMES_COOKIE_LEN,file);
645 if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
646 version_10_file = TRUE;
647 else if (strcmp(cookie,NAMES_COOKIE)) /* ungültiges Format? */
649 Error(ERR_RETURN, "wrong format of names file '%s'", filename);
656 for(i=0;i<MAX_NAMELEN;i++)
657 default_player.login_name[i] = fgetc(file);
658 for(i=0;i<MAX_NAMELEN;i++)
659 default_player.alias_name[i] = fgetc(file);
660 default_player.handicap = fgetc(file);
661 default_player.setup = (fgetc(file)<<8) | fgetc(file);
662 default_player.leveldir_nr = fgetc(file);
663 if (!version_10_file)
665 default_player.level_nr = fgetc(file);
666 for(i=0;i<10;i++) /* currently unused bytes */
670 default_player.level_nr = default_player.handicap;
672 if (feof(file)) /* Spieler noch nicht in Liste enthalten */
674 else /* prüfen, ob Spieler in Liste enthalten */
675 if (!strncmp(default_player.login_name,
676 local_player->login_name, MAX_NAMELEN-1))
678 fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
683 local_player->level_nr = level_nr;
685 for(i=0;i<MAX_NAMELEN;i++)
686 fputc(local_player->login_name[i],file);
687 for(i=0;i<MAX_NAMELEN;i++)
688 fputc(local_player->alias_name[i],file);
689 fputc(local_player->handicap,file);
690 fputc(local_player->setup / 256,file);
691 fputc(local_player->setup % 256,file);
692 fputc(local_player->leveldir_nr,file);
693 if (!version_10_file)
695 fputc(local_player->level_nr,file);
696 for(i=0;i<10;i++) /* currently unused bytes */
703 void LoadJoystickData()
709 if (joystick_status==JOYSTICK_OFF)
713 if (!(file=fopen(JOYDAT_FILE,"r")))
716 fscanf(file,"%s",cookie);
717 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
719 Error(ERR_RETURN, "wrong format of joystick file '%s'", JOYDAT_FILE);
726 fscanf(file,"%s",cookie);
727 fscanf(file, "%d %d %d \n",
728 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
729 fscanf(file, "%d %d %d \n",
730 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
736 load_joystick_data(JOYDAT_FILE);
740 void SaveJoystickData()
745 if (joystick_status==JOYSTICK_OFF)
751 if (!(file=fopen(JOYDAT_FILE,"w")))
753 Error(ERR_RETURN, "cannot save joystick calibration data to file '%s'",
758 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
761 fprintf(file,"JOYSTICK_%d_DATA\n",i);
762 fprintf(file, "%d %d %d \n",
763 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
764 fprintf(file, "%d %d %d \n",
765 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
769 chmod(JOYDAT_FILE, JOYDAT_PERMS);
771 save_joystick_data(JOYDAT_FILE);
776 /* ------------------------------------------------------------------------- */
777 /* new setup functions */
778 /* ------------------------------------------------------------------------- */
780 #define SETUP_TOKEN_SOUND 0
781 #define SETUP_TOKEN_SOUND_LOOPS 1
782 #define SETUP_TOKEN_SOUND_MUSIC 2
783 #define SETUP_TOKEN_SOUND_SIMPLE 3
784 #define SETUP_TOKEN_TOONS 4
785 #define SETUP_TOKEN_DIRECT_DRAW 5
786 #define SETUP_TOKEN_SCROLL_DELAY 6
787 #define SETUP_TOKEN_SOFT_SCROLLING 7
788 #define SETUP_TOKEN_FADING 8
789 #define SETUP_TOKEN_AUTORECORD 9
790 #define SETUP_TOKEN_QUICK_DOORS 10
791 #define SETUP_TOKEN_USE_JOYSTICK 11
792 #define SETUP_TOKEN_JOYSTICK_NR 12
793 #define SETUP_TOKEN_JOY_SNAP 13
794 #define SETUP_TOKEN_JOY_BOMB 14
795 #define SETUP_TOKEN_KEY_LEFT 15
796 #define SETUP_TOKEN_KEY_RIGHT 16
797 #define SETUP_TOKEN_KEY_UP 17
798 #define SETUP_TOKEN_KEY_DOWN 18
799 #define SETUP_TOKEN_KEY_SNAP 19
800 #define SETUP_TOKEN_KEY_BOMB 20
802 #define NUM_SETUP_TOKENS 21
804 #define SETUP_TOKEN_PLAYER_PREFIX "player_"
808 char *token, *value_true, *value_false;
811 { "sound", "on", "off" },
812 { "repeating_sound_loops", "on", "off" },
813 { "background_music", "on", "off" },
814 { "simple_sound_effects", "on", "off" },
815 { "toons", "on", "off" },
816 { "double_buffering", "off", "on" },
817 { "scroll_delay", "on", "off" },
818 { "soft_scrolling", "on", "off" },
819 { "screen_fading", "on", "off" },
820 { "automatic_tape_recording", "on", "off" },
821 { "quick_doors", "on", "off" },
823 /* for each player: */
824 { ".use_joystick", "true", "false" },
825 { ".joystick_device", "second", "first" },
826 { ".joy.snap_field", "", "" },
827 { ".joy.place_bomb", "", "" },
828 { ".key.move_left", "", "" },
829 { ".key.move_right", "", "" },
830 { ".key.move_up", "", "" },
831 { ".key.move_down", "", "" },
832 { ".key.snap_field", "", "" },
833 { ".key.place_bomb", "", "" }
836 static char *string_tolower(char *s)
838 static char s_lower[100];
841 if (strlen(s) >= 100)
846 for (i=0; i<strlen(s_lower); i++)
847 s_lower[i] = tolower(s_lower[i]);
852 static int get_string_integer_value(char *s)
854 static char *number_text[][3] =
856 { "0", "zero", "null", },
857 { "1", "one", "first" },
858 { "2", "two", "second" },
859 { "3", "three", "third" },
860 { "4", "four", "fourth" },
861 { "5", "five", "fifth" },
862 { "6", "six", "sixth" },
863 { "7", "seven", "seventh" },
864 { "8", "eight", "eighth" },
865 { "9", "nine", "ninth" },
866 { "10", "ten", "tenth" },
867 { "11", "eleven", "eleventh" },
868 { "12", "twelve", "twelfth" },
875 if (strcmp(string_tolower(s), number_text[i][j]) == 0)
881 static boolean get_string_boolean_value(char *s)
883 if (strcmp(string_tolower(s), "true") == 0 ||
884 strcmp(string_tolower(s), "yes") == 0 ||
885 strcmp(string_tolower(s), "on") == 0 ||
886 get_string_integer_value(s) == 1)
892 static char *getSetupToken(int token_nr)
894 return setup_info[token_nr].token;
897 static char *getSetupValue(int token_nr, boolean token_value)
899 if (token_value == TRUE)
900 return setup_info[token_nr].value_true;
902 return setup_info[token_nr].value_false;
905 static char *getSetupEntry(char *prefix, int token_nr, int token_value)
908 static char entry[80];
910 sprintf(entry, "%s%s:", prefix, getSetupToken(token_nr));
911 for (i=strlen(entry); i<30; i++)
915 strcat(entry, getSetupValue(token_nr, token_value));
920 static char *getSetupEntryWithComment(char *prefix,int token_nr, KeySym keysym)
923 static char entry[80];
924 char *keyname = getKeyNameFromKeySym(keysym);
926 sprintf(entry, "%s%s:", prefix, getSetupToken(token_nr));
927 for (i=strlen(entry); i<30; i++)
931 strcat(entry, getX11KeyNameFromKeySym(keysym));
932 for (i=strlen(entry); i<50; i++)
936 /* add comment, if useful */
937 if (strcmp(keyname, "(undefined)") != 0 &&
938 strcmp(keyname, "(unknown)") != 0)
941 strcat(entry, keyname);
947 static void freeSetupFileInfo(struct SetupFileInfo *setup_file_info)
949 if (!setup_file_info)
952 if (setup_file_info->token)
953 free(setup_file_info->token);
954 if (setup_file_info->value)
955 free(setup_file_info->value);
956 if (setup_file_info->next)
957 freeSetupFileInfo(setup_file_info->next);
958 free(setup_file_info);
961 static struct SetupFileInfo *newSetupFileInfo(char *token, char *value)
963 struct SetupFileInfo *new = checked_malloc(sizeof(struct SetupFileInfo));
965 new->token = checked_malloc(strlen(token) + 1);
966 strcpy(new->token, token);
968 new->value = checked_malloc(strlen(value) + 1);
969 strcpy(new->value, value);
976 static char *lookupSetupFileValue(struct SetupFileInfo *setup_file_info,
979 if (!setup_file_info)
982 if (strcmp(setup_file_info->token, token) == 0)
983 return setup_file_info->value;
985 return lookupSetupFileValue(setup_file_info->next, token);
989 static void printSetupFileInfo(struct SetupFileInfo *setup_file_info)
991 if (!setup_file_info)
994 printf("token: '%s'\n", setup_file_info->token);
995 printf("value: '%s'\n", setup_file_info->value);
997 printSetupFileInfo(setup_file_info->next);
1001 static void decodeSetupFileInfo(struct SetupFileInfo *setup_file_info)
1008 int token_integer_value;
1009 boolean token_boolean_value;
1010 int token_player_prefix_len;
1012 if (!setup_file_info)
1015 token = setup_file_info->token;
1016 token_value = setup_file_info->value;
1017 token_integer_value = get_string_integer_value(token_value);
1018 token_boolean_value = get_string_boolean_value(token_value);
1020 token_player_prefix_len = strlen(SETUP_TOKEN_PLAYER_PREFIX);
1022 if (strncmp(token, SETUP_TOKEN_PLAYER_PREFIX, token_player_prefix_len) == 0)
1024 token += token_player_prefix_len;
1026 if (*token >= '0' && *token <= '9')
1028 player_nr = ((int)(*token - '0') - 1 + MAX_PLAYERS) % MAX_PLAYERS;
1033 for (i=0; i<NUM_SETUP_TOKENS; i++)
1035 if (strcmp(token, setup_info[i].token) == 0)
1045 printf("token == '%s', token_integer_value == %d\n",
1046 token, token_integer_value);
1049 printf("[player %d] token == '%s', token_value == '%s' (%ld)\n",
1050 player_nr, token, token_value,
1051 (unsigned long)getKeySymFromX11KeyName(token_value));
1058 case SETUP_TOKEN_SOUND:
1059 setup.sound_on = token_boolean_value;
1061 case SETUP_TOKEN_SOUND_LOOPS:
1062 setup.sound_loops_on = token_boolean_value;
1064 case SETUP_TOKEN_SOUND_MUSIC:
1065 setup.sound_music_on = token_boolean_value;
1067 case SETUP_TOKEN_SOUND_SIMPLE:
1068 setup.sound_simple_on = token_boolean_value;
1070 case SETUP_TOKEN_TOONS:
1071 setup.toons_on = token_boolean_value;
1073 case SETUP_TOKEN_DIRECT_DRAW:
1074 setup.direct_draw_on = token_boolean_value;
1076 case SETUP_TOKEN_SCROLL_DELAY:
1077 setup.scroll_delay_on = token_boolean_value;
1079 case SETUP_TOKEN_SOFT_SCROLLING:
1080 setup.soft_scrolling_on = token_boolean_value;
1082 case SETUP_TOKEN_FADING:
1083 setup.fading_on = token_boolean_value;
1085 case SETUP_TOKEN_AUTORECORD:
1086 setup.autorecord_on = token_boolean_value;
1088 case SETUP_TOKEN_QUICK_DOORS:
1089 setup.quick_doors = token_boolean_value;
1092 case SETUP_TOKEN_USE_JOYSTICK:
1093 setup.input[player_nr].use_joystick = token_boolean_value;
1095 case SETUP_TOKEN_JOYSTICK_NR:
1096 if (token_integer_value < 0 || token_integer_value > 1)
1097 token_integer_value = 1;
1098 setup.input[player_nr].joystick_nr = token_integer_value - 1;
1100 case SETUP_TOKEN_JOY_SNAP:
1101 setup.input[player_nr].joy.snap = getJoySymbolFromJoyName(token_value);
1103 case SETUP_TOKEN_JOY_BOMB :
1104 setup.input[player_nr].joy.bomb = getJoySymbolFromJoyName(token_value);
1106 case SETUP_TOKEN_KEY_LEFT:
1107 setup.input[player_nr].key.left = getKeySymFromX11KeyName(token_value);
1109 case SETUP_TOKEN_KEY_RIGHT:
1110 setup.input[player_nr].key.right = getKeySymFromX11KeyName(token_value);
1112 case SETUP_TOKEN_KEY_UP:
1113 setup.input[player_nr].key.up = getKeySymFromX11KeyName(token_value);
1115 case SETUP_TOKEN_KEY_DOWN:
1116 setup.input[player_nr].key.down = getKeySymFromX11KeyName(token_value);
1118 case SETUP_TOKEN_KEY_SNAP:
1119 setup.input[player_nr].key.snap = getKeySymFromX11KeyName(token_value);
1121 case SETUP_TOKEN_KEY_BOMB:
1122 setup.input[player_nr].key.bomb = getKeySymFromX11KeyName(token_value);
1128 decodeSetupFileInfo(setup_file_info->next);
1134 char filename[MAX_FILENAME_LEN];
1135 char line[MAX_LINE_LEN];
1136 char *token, *value, *line_ptr;
1137 struct SetupFileInfo *setup_file_info, **next_entry = &setup_file_info;
1142 printf("LoadSetup\n");
1146 sprintf(filename, "%s/%s", SETUP_PATH, SETUP_FILENAME);
1148 if (!(file = fopen(filename, "r")))
1152 Error(ERR_RETURN, "cannot open setup file '%s'", filename);
1154 /* use default values for setup */
1156 setup.sound_on = TRUE;
1157 setup.sound_loops_on = FALSE;
1158 setup.sound_music_on = FALSE;
1159 setup.sound_simple_on = FALSE;
1160 setup.toons_on = TRUE;
1161 setup.direct_draw_on = FALSE;
1162 setup.scroll_delay_on = FALSE;
1163 setup.soft_scrolling_on = TRUE;
1164 setup.fading_on = FALSE;
1165 setup.autorecord_on = FALSE;
1166 setup.quick_doors = FALSE;
1168 for (i=0; i<MAX_PLAYERS; i++)
1170 setup.input[i].use_joystick = FALSE;
1171 setup.input[i].joystick_nr = 0;
1172 setup.input[i].joy.snap = (i == 0 ? JOY_BUTTON_1 : 0);
1173 setup.input[i].joy.bomb = (i == 0 ? JOY_BUTTON_2 : 0);
1174 setup.input[i].key.left = (i == 0 ? DEFAULT_KEY_LEFT : KEY_UNDEFINDED);
1175 setup.input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KEY_UNDEFINDED);
1176 setup.input[i].key.up = (i == 0 ? DEFAULT_KEY_UP : KEY_UNDEFINDED);
1177 setup.input[i].key.down = (i == 0 ? DEFAULT_KEY_DOWN : KEY_UNDEFINDED);
1178 setup.input[i].key.snap = (i == 0 ? DEFAULT_KEY_SNAP : KEY_UNDEFINDED);
1179 setup.input[i].key.bomb = (i == 0 ? DEFAULT_KEY_BOMB : KEY_UNDEFINDED);
1188 next_entry = &setup_file;
1195 /* read next line */
1196 if (!fgets(line, MAX_LINE_LEN, file))
1199 /* cut trailing comment or whitespace from input line */
1200 for (line_ptr = line; *line_ptr; line_ptr++)
1202 if (*line_ptr == '#' || *line_ptr == '\n')
1209 /* cut trailing whitespaces from input line */
1210 for (line_ptr = &line[strlen(line)]; line_ptr > line; line_ptr--)
1211 if ((*line_ptr == ' ' || *line_ptr == '\t') && line_ptr[1] == '\0')
1214 /* ignore empty lines */
1218 line_len = strlen(line);
1222 printf("line: '%s'\n", line);
1226 /* cut leading whitespaces from token */
1227 for (token = line; *token; token++)
1228 if (*token != ' ' && *token != '\t')
1231 /* find end of token */
1232 for (line_ptr = token; *line_ptr; line_ptr++)
1234 if (*line_ptr == ' ' || *line_ptr == '\t' || *line_ptr == ':')
1241 if (line_ptr < line + line_len)
1242 value = line_ptr + 1;
1246 /* cut leading whitespaces from value */
1247 for (; *value; value++)
1248 if (*value != ' ' && *value != '\t')
1253 printf("token / value: '%s' / '%s'\n", token, value);
1257 if (*token && *value)
1259 /* allocate new token/value pair */
1261 *next_entry = newSetupFileInfo(token, value);
1262 next_entry = &((*next_entry)->next);
1269 printf("Content of setup file info:\n");
1271 printSetupFileInfo(setup_file_info);
1276 printf("decodeSetupFileInfo\n");
1280 decodeSetupFileInfo(setup_file_info);
1281 freeSetupFileInfo(setup_file_info);
1287 char filename[MAX_FILENAME_LEN];
1292 printf("SaveSetup\n");
1296 sprintf(filename, "%s/%s", SETUP_PATH, SETUP_FILENAME);
1298 if (!(file = fopen(filename, "w")))
1300 Error(ERR_RETURN, "cannot write setup file '%s'", filename);
1304 fprintf(file, "file_identifier: %s\n",
1307 fprintf(file, "\n");
1309 fprintf(file, "%s\n",
1310 getSetupEntry("", SETUP_TOKEN_SOUND,
1312 fprintf(file, "%s\n",
1313 getSetupEntry("", SETUP_TOKEN_SOUND_LOOPS,
1314 setup.sound_loops_on));
1315 fprintf(file, "%s\n",
1316 getSetupEntry("", SETUP_TOKEN_SOUND_MUSIC,
1317 setup.sound_music_on));
1318 fprintf(file, "%s\n",
1319 getSetupEntry("", SETUP_TOKEN_SOUND_SIMPLE,
1320 setup.sound_simple_on));
1321 fprintf(file, "%s\n",
1322 getSetupEntry("", SETUP_TOKEN_TOONS,
1324 fprintf(file, "%s\n",
1325 getSetupEntry("", SETUP_TOKEN_DIRECT_DRAW,
1326 setup.direct_draw_on));
1327 fprintf(file, "%s\n",
1328 getSetupEntry("", SETUP_TOKEN_SCROLL_DELAY,
1329 setup.scroll_delay_on));
1330 fprintf(file, "%s\n",
1331 getSetupEntry("", SETUP_TOKEN_SOFT_SCROLLING,
1332 setup.soft_scrolling_on));
1333 fprintf(file, "%s\n",
1334 getSetupEntry("", SETUP_TOKEN_FADING,
1336 fprintf(file, "%s\n",
1337 getSetupEntry("", SETUP_TOKEN_AUTORECORD,
1338 setup.autorecord_on));
1339 fprintf(file, "%s\n",
1340 getSetupEntry("", SETUP_TOKEN_QUICK_DOORS,
1341 setup.quick_doors));
1343 for (i=0; i<MAX_PLAYERS; i++)
1347 sprintf(prefix, "%s%d", SETUP_TOKEN_PLAYER_PREFIX, i + 1);
1349 fprintf(file, "\n");
1351 fprintf(file, "%s\n",
1352 getSetupEntry(prefix, SETUP_TOKEN_USE_JOYSTICK,
1353 setup.input[i].use_joystick));
1354 fprintf(file, "%s\n",
1355 getSetupEntry(prefix, SETUP_TOKEN_JOYSTICK_NR,
1356 setup.input[i].joystick_nr));
1358 fprintf(file, "%s%s: %s\n", prefix,
1359 getSetupToken(SETUP_TOKEN_JOY_SNAP),
1360 getJoyNameFromJoySymbol(setup.input[i].joy.snap));
1361 fprintf(file, "%s%s: %s\n", prefix,
1362 getSetupToken(SETUP_TOKEN_JOY_BOMB),
1363 getJoyNameFromJoySymbol(setup.input[i].joy.bomb));
1365 fprintf(file, "%s\n",
1366 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_LEFT,
1367 setup.input[i].key.left));
1368 fprintf(file, "%s\n",
1369 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_RIGHT,
1370 setup.input[i].key.right));
1371 fprintf(file, "%s\n",
1372 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_UP,
1373 setup.input[i].key.up));
1374 fprintf(file, "%s\n",
1375 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_DOWN,
1376 setup.input[i].key.down));
1377 fprintf(file, "%s\n",
1378 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_SNAP,
1379 setup.input[i].key.snap));
1380 fprintf(file, "%s\n",
1381 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_BOMB,
1382 setup.input[i].key.bomb));
1385 chmod(filename, SETUP_PERMS);