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 LoadLevelInfo()
25 char filename[MAX_FILENAME_LEN];
26 char cookie[MAX_FILENAME_LEN];
29 sprintf(filename,"%s/%s",level_directory,LEVDIR_FILENAME);
31 if (!(file=fopen(filename,"r")))
33 Error(ERR_WARN, "cannot read level info '%s'", filename);
37 fscanf(file,"%s\n",cookie);
38 if (strcmp(cookie,LEVELDIR_COOKIE)) /* ungültiges Format? */
40 Error(ERR_WARN, "wrong format of level info file");
47 for(i=0;i<MAX_LEVDIR_ENTRIES;i++)
49 fscanf(file,"%s",leveldir[i].filename);
50 fscanf(file,"%s",leveldir[i].name);
51 fscanf(file,"%d",&leveldir[i].levels);
52 fscanf(file,"%d",&leveldir[i].readonly);
61 Error(ERR_WARN, "empty level info '%s'", filename);
68 void LoadLevel(int level_nr)
71 char filename[MAX_FILENAME_LEN];
72 char cookie[MAX_FILENAME_LEN];
75 sprintf(filename,"%s/%s/%d",
76 level_directory,leveldir[leveldir_nr].filename,level_nr);
78 if (!(file = fopen(filename,"r")))
79 Error(ERR_WARN, "cannot read level '%s' - creating new level", filename);
82 fgets(cookie,LEVEL_COOKIE_LEN,file);
85 if (strcmp(cookie,LEVEL_COOKIE)) /* ungültiges Format? */
87 Error(ERR_WARN, "wrong format of level file '%s'", filename);
95 lev_fieldx = level.fieldx = fgetc(file);
96 lev_fieldy = level.fieldy = fgetc(file);
98 level.time = (fgetc(file)<<8) | fgetc(file);
99 level.edelsteine = (fgetc(file)<<8) | fgetc(file);
100 for(i=0;i<MAX_LEVNAMLEN;i++)
101 level.name[i] = fgetc(file);
102 level.name[MAX_LEVNAMLEN-1] = 0;
103 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
104 level.score[i] = fgetc(file);
108 level.mampfer_inhalt[i][x][y] = fgetc(file);
109 level.tempo_amoebe = fgetc(file);
110 level.dauer_sieb = fgetc(file);
111 level.dauer_ablenk = fgetc(file);
112 level.amoebe_inhalt = fgetc(file);
114 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
117 for(y=0;y<MAX_LEV_FIELDY;y++)
118 for(x=0;x<MAX_LEV_FIELDX;x++)
119 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
121 for(y=0;y<lev_fieldy;y++)
122 for(x=0;x<lev_fieldx;x++)
123 Feld[x][y] = Ur[x][y] = fgetc(file);
127 if (level.time<=10) /* Mindestspieldauer */
132 lev_fieldx = level.fieldx = STD_LEV_FIELDX;
133 lev_fieldy = level.fieldy = STD_LEV_FIELDY;
136 level.edelsteine = 0;
137 strncpy(level.name,"Nameless Level",MAX_LEVNAMLEN-1);
138 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
143 level.mampfer_inhalt[i][x][y] = EL_FELSBROCKEN;
144 level.tempo_amoebe = 10;
145 level.dauer_sieb = 10;
146 level.dauer_ablenk = 10;
147 level.amoebe_inhalt = EL_DIAMANT;
149 for(y=0;y<STD_LEV_FIELDY;y++)
150 for(x=0;x<STD_LEV_FIELDX;x++)
151 Feld[x][y] = Ur[x][y] = EL_ERDREICH;
152 Feld[0][0] = Ur[0][0] = EL_SPIELFIGUR;
153 Feld[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
154 Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_AUSGANG_ZU;
158 void SaveLevel(int level_nr)
161 char filename[MAX_FILENAME_LEN];
164 sprintf(filename,"%s/%s/%d",
165 level_directory,leveldir[leveldir_nr].filename,level_nr);
167 if (!(file=fopen(filename,"w")))
169 Error(ERR_WARN, "cannot save level file '%s'", filename);
173 fputs(LEVEL_COOKIE,file); /* Formatkennung */
176 fputc(level.fieldx,file);
177 fputc(level.fieldy,file);
178 fputc(level.time / 256,file);
179 fputc(level.time % 256,file);
180 fputc(level.edelsteine / 256,file);
181 fputc(level.edelsteine % 256,file);
183 for(i=0;i<MAX_LEVNAMLEN;i++)
184 fputc(level.name[i],file);
185 for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
186 fputc(level.score[i],file);
190 fputc(level.mampfer_inhalt[i][x][y],file);
191 fputc(level.tempo_amoebe,file);
192 fputc(level.dauer_sieb,file);
193 fputc(level.dauer_ablenk,file);
194 fputc(level.amoebe_inhalt,file);
196 for(i=0;i<NUM_FREE_LVHD_BYTES;i++) /* Rest frei / Headergröße 80 Bytes */
199 for(y=0;y<lev_fieldy;y++)
200 for(x=0;x<lev_fieldx;x++)
201 fputc(Ur[x][y],file);
205 chmod(filename, LEVEL_PERMS);
208 void LoadLevelTape(int level_nr)
211 char filename[MAX_FILENAME_LEN];
212 char cookie[MAX_FILENAME_LEN];
214 boolean levelrec_10 = FALSE;
217 sprintf(filename,"%s/%s/%d.tape",
218 level_directory,leveldir[leveldir_nr].filename,level_nr);
220 sprintf(filename,"%s/%s/%d.tap",
221 level_directory,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_10)) /* old 1.0 tape format */
230 else if (strcmp(cookie,LEVELREC_COOKIE)) /* unknown tape format */
232 Error(ERR_WARN, "wrong format of level recording file '%s'", filename);
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 (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file);
248 tape.level_nr = level_nr;
250 tape.changed = FALSE;
252 tape.recording = FALSE;
253 tape.playing = FALSE;
254 tape.pausing = FALSE;
256 for(i=0;i<tape.length;i++)
260 if (i >= MAX_TAPELEN)
263 for(j=0; j<MAX_PLAYERS; j++)
265 if (levelrec_10 && j>0)
267 tape.pos[i].action[j] = MV_NO_MOVING;
270 tape.pos[i].action[j] = fgetc(file);
273 tape.pos[i].delay = fgetc(file);
281 if (i != tape.length)
282 Error(ERR_WARN, "level recording file '%s' corrupted", filename);
284 tape.length_seconds = GetTapeLength();
287 void SaveLevelTape(int level_nr)
290 char filename[MAX_FILENAME_LEN];
292 boolean new_tape = TRUE;
295 sprintf(filename,"%s/%s/%d.tape",
296 level_directory,leveldir[leveldir_nr].filename,level_nr);
298 sprintf(filename,"%s/%s/%d.tap",
299 level_directory,leveldir[leveldir_nr].filename,level_nr);
302 /* Testen, ob bereits eine Aufnahme existiert */
303 if ((file=fopen(filename,"r")))
308 if (!Request("Replace old tape ?",REQ_ASK))
312 if (!(file=fopen(filename,"w")))
314 Error(ERR_WARN, "cannot save level recording file '%s'", filename);
318 fputs(LEVELREC_COOKIE,file); /* Formatkennung */
321 fputc((tape.random_seed >> 24) & 0xff,file);
322 fputc((tape.random_seed >> 16) & 0xff,file);
323 fputc((tape.random_seed >> 8) & 0xff,file);
324 fputc((tape.random_seed >> 0) & 0xff,file);
326 fputc((tape.date >> 24) & 0xff,file);
327 fputc((tape.date >> 16) & 0xff,file);
328 fputc((tape.date >> 8) & 0xff,file);
329 fputc((tape.date >> 0) & 0xff,file);
331 fputc((tape.length >> 24) & 0xff,file);
332 fputc((tape.length >> 16) & 0xff,file);
333 fputc((tape.length >> 8) & 0xff,file);
334 fputc((tape.length >> 0) & 0xff,file);
336 for(i=0;i<tape.length;i++)
340 for(j=0; j<MAX_PLAYERS; j++)
341 fputc(tape.pos[i].action[j],file);
343 fputc(tape.pos[i].delay,file);
348 chmod(filename, LEVREC_PERMS);
350 tape.changed = FALSE;
353 Request("tape saved !",REQ_CONFIRM);
356 boolean CreateNewScoreFile()
359 char filename[MAX_FILENAME_LEN];
360 char empty_alias[MAX_NAMELEN];
363 sprintf(filename,"%s/%s/%s",
364 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
366 if (!(file=fopen(filename,"w")))
369 for(i=0;i<MAX_NAMELEN;i++)
371 strncpy(empty_alias,EMPTY_ALIAS,MAX_NAMELEN-1);
373 fputs(SCORE_COOKIE,file); /* Formatkennung */
374 for(i=0;i<leveldir[leveldir_nr].levels;i++)
376 for(j=0;j<MAX_SCORE_ENTRIES;j++)
378 for(k=0;k<MAX_NAMELEN;k++)
379 fputc(empty_alias[k],file);
386 chmod(filename, SCORE_PERMS);
390 void LoadScore(int level_nr)
393 char filename[MAX_FILENAME_LEN];
394 char cookie[MAX_FILENAME_LEN];
397 sprintf(filename,"%s/%s/%s",
398 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
400 if (!(file = fopen(filename,"r")))
402 if (!CreateNewScoreFile())
403 Error(ERR_WARN, "cannot create score file '%s'", filename);
404 else if (!(file = fopen(filename,"r")))
405 Error(ERR_WARN, "cannot read score for level %d", level_nr);
410 fgets(cookie,SCORE_COOKIE_LEN,file);
411 if (strcmp(cookie,SCORE_COOKIE)) /* ungültiges Format? */
413 Error(ERR_WARN, "wrong format of score file '%s'", filename);
422 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
424 for(i=0;i<MAX_SCORE_ENTRIES;i++)
426 for(j=0;j<MAX_NAMELEN;j++)
427 highscore[i].Name[j] = fgetc(file);
428 highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
434 for(i=0;i<MAX_SCORE_ENTRIES;i++)
436 strcpy(highscore[i].Name,EMPTY_ALIAS);
437 highscore[i].Score = 0;
442 void SaveScore(int level_nr)
445 char filename[MAX_FILENAME_LEN];
448 sprintf(filename,"%s/%s/%s",
449 level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
451 if (!(file=fopen(filename,"r+")))
453 Error(ERR_WARN, "cannot save score for level %d", level_nr);
458 SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
460 for(i=0;i<MAX_SCORE_ENTRIES;i++)
462 for(j=0;j<MAX_NAMELEN;j++)
463 fputc(highscore[i].Name[j],file);
464 fputc(highscore[i].Score / 256,file);
465 fputc(highscore[i].Score % 256,file);
470 void LoadJoystickData()
476 if (joystick_status==JOYSTICK_OFF)
480 if (!(file=fopen(JOYDAT_FILE,"r")))
483 fscanf(file,"%s",cookie);
484 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
486 Error(ERR_WARN, "wrong format of joystick file '%s'", JOYDAT_FILE);
493 fscanf(file,"%s",cookie);
494 fscanf(file, "%d %d %d \n",
495 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
496 fscanf(file, "%d %d %d \n",
497 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
503 load_joystick_data(JOYDAT_FILE);
507 void SaveJoystickData()
512 if (joystick_status==JOYSTICK_OFF)
518 if (!(file=fopen(JOYDAT_FILE,"w")))
520 Error(ERR_WARN, "cannot save joystick calibration data to file '%s'",
525 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
528 fprintf(file,"JOYSTICK_%d_DATA\n",i);
529 fprintf(file, "%d %d %d \n",
530 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
531 fprintf(file, "%d %d %d \n",
532 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
536 chmod(JOYDAT_FILE, JOYDAT_PERMS);
538 save_joystick_data(JOYDAT_FILE);
543 /* ------------------------------------------------------------------------- */
544 /* new setup functions */
545 /* ------------------------------------------------------------------------- */
547 #define MAX_LINE_LEN 1000
548 #define MAX_SETUP_TOKEN_LEN 100
549 #define MAX_SETUP_VALUE_LEN 100
551 #define TOKEN_STR_FILE_IDENTIFIER "file_identifier"
552 #define TOKEN_STR_LAST_LEVEL_SERIES "last_level_series"
553 #define TOKEN_STR_ALIAS_NAME "alias_name"
555 #define TOKEN_STR_PLAYER_PREFIX "player_"
556 #define TOKEN_VALUE_POSITION 30
557 #define TOKEN_INVALID -1
558 #define TOKEN_IGNORE -99
560 #define SETUP_TOKEN_ALIAS_NAME 100
562 #define SETUP_TOKEN_SOUND 0
563 #define SETUP_TOKEN_SOUND_LOOPS 1
564 #define SETUP_TOKEN_SOUND_MUSIC 2
565 #define SETUP_TOKEN_SOUND_SIMPLE 3
566 #define SETUP_TOKEN_TOONS 4
567 #define SETUP_TOKEN_DIRECT_DRAW 5
568 #define SETUP_TOKEN_SCROLL_DELAY 6
569 #define SETUP_TOKEN_SOFT_SCROLLING 7
570 #define SETUP_TOKEN_FADING 8
571 #define SETUP_TOKEN_AUTORECORD 9
572 #define SETUP_TOKEN_QUICK_DOORS 10
573 #define SETUP_TOKEN_USE_JOYSTICK 11
574 #define SETUP_TOKEN_JOYSTICK_NR 12
575 #define SETUP_TOKEN_JOY_SNAP 13
576 #define SETUP_TOKEN_JOY_BOMB 14
577 #define SETUP_TOKEN_KEY_LEFT 15
578 #define SETUP_TOKEN_KEY_RIGHT 16
579 #define SETUP_TOKEN_KEY_UP 17
580 #define SETUP_TOKEN_KEY_DOWN 18
581 #define SETUP_TOKEN_KEY_SNAP 19
582 #define SETUP_TOKEN_KEY_BOMB 20
584 #define NUM_SETUP_TOKENS 21
588 char *token, *value_true, *value_false;
591 { "sound", "on", "off" },
592 { "repeating_sound_loops", "on", "off" },
593 { "background_music", "on", "off" },
594 { "simple_sound_effects", "on", "off" },
595 { "toons", "on", "off" },
596 { "double_buffering", "off", "on" },
597 { "scroll_delay", "on", "off" },
598 { "soft_scrolling", "on", "off" },
599 { "screen_fading", "on", "off" },
600 { "automatic_tape_recording", "on", "off" },
601 { "quick_doors", "on", "off" },
603 /* for each player: */
604 { ".use_joystick", "true", "false" },
605 { ".joystick_device", "second", "first" },
606 { ".joy.snap_field", "", "" },
607 { ".joy.place_bomb", "", "" },
608 { ".key.move_left", "", "" },
609 { ".key.move_right", "", "" },
610 { ".key.move_up", "", "" },
611 { ".key.move_down", "", "" },
612 { ".key.snap_field", "", "" },
613 { ".key.place_bomb", "", "" }
616 static char *string_tolower(char *s)
618 static char s_lower[100];
621 if (strlen(s) >= 100)
626 for (i=0; i<strlen(s_lower); i++)
627 s_lower[i] = tolower(s_lower[i]);
632 static int get_string_integer_value(char *s)
634 static char *number_text[][3] =
636 { "0", "zero", "null", },
637 { "1", "one", "first" },
638 { "2", "two", "second" },
639 { "3", "three", "third" },
640 { "4", "four", "fourth" },
641 { "5", "five", "fifth" },
642 { "6", "six", "sixth" },
643 { "7", "seven", "seventh" },
644 { "8", "eight", "eighth" },
645 { "9", "nine", "ninth" },
646 { "10", "ten", "tenth" },
647 { "11", "eleven", "eleventh" },
648 { "12", "twelve", "twelfth" },
655 if (strcmp(string_tolower(s), number_text[i][j]) == 0)
661 static boolean get_string_boolean_value(char *s)
663 if (strcmp(string_tolower(s), "true") == 0 ||
664 strcmp(string_tolower(s), "yes") == 0 ||
665 strcmp(string_tolower(s), "on") == 0 ||
666 get_string_integer_value(s) == 1)
672 static char *getSetupToken(int token_nr)
674 return setup_info[token_nr].token;
677 static char *getSetupValue(int token_nr, boolean token_value)
679 if (token_value == TRUE)
680 return setup_info[token_nr].value_true;
682 return setup_info[token_nr].value_false;
685 static char *getFormattedSetupEntry(char *token, char *value)
688 static char entry[MAX_LINE_LEN];
690 sprintf(entry, "%s:", token);
691 for (i=strlen(entry); i<TOKEN_VALUE_POSITION; i++)
695 strcat(entry, value);
700 static char *getSetupEntry(char *prefix, int token_nr, int token_value)
703 static char entry[MAX_LINE_LEN];
705 sprintf(entry, "%s%s:", prefix, getSetupToken(token_nr));
706 for (i=strlen(entry); i<TOKEN_VALUE_POSITION; i++)
710 strcat(entry, getSetupValue(token_nr, token_value));
715 static char *getSetupEntryWithComment(char *prefix,int token_nr, KeySym keysym)
718 static char entry[MAX_LINE_LEN];
719 char *keyname = getKeyNameFromKeySym(keysym);
721 sprintf(entry, "%s%s:", prefix, getSetupToken(token_nr));
722 for (i=strlen(entry); i<TOKEN_VALUE_POSITION; i++)
726 strcat(entry, getX11KeyNameFromKeySym(keysym));
727 for (i=strlen(entry); i<50; i++)
731 /* add comment, if useful */
732 if (strcmp(keyname, "(undefined)") != 0 &&
733 strcmp(keyname, "(unknown)") != 0)
736 strcat(entry, keyname);
742 static void freeSetupFileList(struct SetupFileList *setup_file_list)
744 if (!setup_file_list)
747 if (setup_file_list->token)
748 free(setup_file_list->token);
749 if (setup_file_list->value)
750 free(setup_file_list->value);
751 if (setup_file_list->next)
752 freeSetupFileList(setup_file_list->next);
753 free(setup_file_list);
756 static struct SetupFileList *newSetupFileList(char *token, char *value)
758 struct SetupFileList *new = checked_malloc(sizeof(struct SetupFileList));
760 new->token = checked_malloc(strlen(token) + 1);
761 strcpy(new->token, token);
763 new->value = checked_malloc(strlen(value) + 1);
764 strcpy(new->value, value);
771 static char *getSetupFileListEntry(struct SetupFileList *setup_file_list,
774 if (!setup_file_list)
777 if (strcmp(setup_file_list->token, token) == 0)
778 return setup_file_list->value;
780 return getSetupFileListEntry(setup_file_list->next, token);
783 boolean setSetupFileListEntry(struct SetupFileList *setup_file_list,
784 char *token, char *value)
786 if (!setup_file_list)
789 if (strcmp(setup_file_list->token, token) == 0)
791 free(setup_file_list->value);
792 setup_file_list->value = checked_malloc(strlen(value) + 1);
793 strcpy(setup_file_list->value, value);
798 return setSetupFileListEntry(setup_file_list->next, token, value);
801 void updateSetupFileListEntry(struct SetupFileList *setup_file_list,
802 char *token, char *value)
804 if (!setup_file_list)
807 if (getSetupFileListEntry(setup_file_list, token) != NULL)
808 setSetupFileListEntry(setup_file_list, token, value);
811 struct SetupFileList *list_entry = setup_file_list;
813 while (list_entry->next)
814 list_entry = list_entry->next;
816 list_entry->next = newSetupFileList(token, value);
821 static void printSetupFileList(struct SetupFileList *setup_file_list)
823 if (!setup_file_list)
826 printf("token: '%s'\n", setup_file_list->token);
827 printf("value: '%s'\n", setup_file_list->value);
829 printSetupFileList(setup_file_list->next);
833 static struct SetupFileList *loadSetupFileList(char *filename)
836 char line[MAX_LINE_LEN];
837 char *token, *value, *line_ptr;
838 struct SetupFileList *setup_file_list = newSetupFileList("", "");
839 struct SetupFileList *first_valid_list_entry;
844 struct SetupFileList **next_entry = &setup_file_list;
850 if (!(file = fopen(filename, "r")))
852 Error(ERR_WARN, "cannot open setup file '%s'", filename);
858 /* read next line of input file */
859 if (!fgets(line, MAX_LINE_LEN, file))
862 /* cut trailing comment or whitespace from input line */
863 for (line_ptr = line; *line_ptr; line_ptr++)
865 if (*line_ptr == '#' || *line_ptr == '\n')
872 /* cut trailing whitespaces from input line */
873 for (line_ptr = &line[strlen(line)]; line_ptr > line; line_ptr--)
874 if ((*line_ptr == ' ' || *line_ptr == '\t') && line_ptr[1] == '\0')
877 /* ignore empty lines */
881 line_len = strlen(line);
883 /* cut leading whitespaces from token */
884 for (token = line; *token; token++)
885 if (*token != ' ' && *token != '\t')
888 /* find end of token */
889 for (line_ptr = token; *line_ptr; line_ptr++)
891 if (*line_ptr == ' ' || *line_ptr == '\t' || *line_ptr == ':')
898 if (line_ptr < line + line_len)
899 value = line_ptr + 1;
903 /* cut leading whitespaces from value */
904 for (; *value; value++)
905 if (*value != ' ' && *value != '\t')
908 if (*token && *value)
909 updateSetupFileListEntry(setup_file_list, token, value);
914 /* allocate new token/value pair */
916 *next_entry = newSetupFileList(token, value);
917 next_entry = &((*next_entry)->next);
927 first_valid_list_entry = setup_file_list->next;
929 /* free empty list header */
930 setup_file_list->next = NULL;
931 freeSetupFileList(setup_file_list);
933 if (!first_valid_list_entry)
934 Error(ERR_WARN, "setup file is empty");
936 return first_valid_list_entry;
939 static void checkSetupFileListIdentifier(struct SetupFileList *setup_file_list,
942 if (!setup_file_list)
945 if (strcmp(setup_file_list->token, TOKEN_STR_FILE_IDENTIFIER) == 0)
947 if (strcmp(setup_file_list->value, identifier) != 0)
949 Error(ERR_WARN, "setup file has wrong version");
956 if (setup_file_list->next)
957 checkSetupFileListIdentifier(setup_file_list->next, identifier);
960 Error(ERR_WARN, "setup file has no version information");
965 static void decodeSetupFileList(struct SetupFileList *setup_file_list)
968 int token_nr = TOKEN_INVALID;
972 int token_integer_value;
973 boolean token_boolean_value;
974 int token_player_prefix_len;
976 if (!setup_file_list)
979 token = setup_file_list->token;
980 token_value = setup_file_list->value;
981 token_integer_value = get_string_integer_value(token_value);
982 token_boolean_value = get_string_boolean_value(token_value);
984 token_player_prefix_len = strlen(TOKEN_STR_PLAYER_PREFIX);
986 if (strncmp(token, TOKEN_STR_PLAYER_PREFIX,
987 token_player_prefix_len) == 0)
989 token += token_player_prefix_len;
991 if (*token >= '0' && *token <= '9')
993 player_nr = ((int)(*token - '0') - 1 + MAX_PLAYERS) % MAX_PLAYERS;
998 for (i=0; i<NUM_SETUP_TOKENS; i++)
1000 if (strcmp(token, setup_info[i].token) == 0)
1007 if (strcmp(token, TOKEN_STR_FILE_IDENTIFIER) == 0)
1008 token_nr = TOKEN_IGNORE;
1009 else if (strcmp(token, TOKEN_STR_ALIAS_NAME) == 0)
1010 token_nr = SETUP_TOKEN_ALIAS_NAME;
1014 case SETUP_TOKEN_SOUND:
1015 setup.sound_on = token_boolean_value;
1017 case SETUP_TOKEN_SOUND_LOOPS:
1018 setup.sound_loops_on = token_boolean_value;
1020 case SETUP_TOKEN_SOUND_MUSIC:
1021 setup.sound_music_on = token_boolean_value;
1023 case SETUP_TOKEN_SOUND_SIMPLE:
1024 setup.sound_simple_on = token_boolean_value;
1026 case SETUP_TOKEN_TOONS:
1027 setup.toons_on = token_boolean_value;
1029 case SETUP_TOKEN_DIRECT_DRAW:
1030 setup.direct_draw_on = !token_boolean_value;
1032 case SETUP_TOKEN_SCROLL_DELAY:
1033 setup.scroll_delay_on = token_boolean_value;
1035 case SETUP_TOKEN_SOFT_SCROLLING:
1036 setup.soft_scrolling_on = token_boolean_value;
1038 case SETUP_TOKEN_FADING:
1039 setup.fading_on = token_boolean_value;
1041 case SETUP_TOKEN_AUTORECORD:
1042 setup.autorecord_on = token_boolean_value;
1044 case SETUP_TOKEN_QUICK_DOORS:
1045 setup.quick_doors = token_boolean_value;
1048 case SETUP_TOKEN_USE_JOYSTICK:
1049 setup.input[player_nr].use_joystick = token_boolean_value;
1051 case SETUP_TOKEN_JOYSTICK_NR:
1052 if (token_integer_value < 0 || token_integer_value > 1)
1053 token_integer_value = 1;
1054 setup.input[player_nr].joystick_nr = token_integer_value - 1;
1056 case SETUP_TOKEN_JOY_SNAP:
1057 setup.input[player_nr].joy.snap = getJoySymbolFromJoyName(token_value);
1059 case SETUP_TOKEN_JOY_BOMB :
1060 setup.input[player_nr].joy.bomb = getJoySymbolFromJoyName(token_value);
1062 case SETUP_TOKEN_KEY_LEFT:
1063 setup.input[player_nr].key.left = getKeySymFromX11KeyName(token_value);
1065 case SETUP_TOKEN_KEY_RIGHT:
1066 setup.input[player_nr].key.right = getKeySymFromX11KeyName(token_value);
1068 case SETUP_TOKEN_KEY_UP:
1069 setup.input[player_nr].key.up = getKeySymFromX11KeyName(token_value);
1071 case SETUP_TOKEN_KEY_DOWN:
1072 setup.input[player_nr].key.down = getKeySymFromX11KeyName(token_value);
1074 case SETUP_TOKEN_KEY_SNAP:
1075 setup.input[player_nr].key.snap = getKeySymFromX11KeyName(token_value);
1077 case SETUP_TOKEN_KEY_BOMB:
1078 setup.input[player_nr].key.bomb = getKeySymFromX11KeyName(token_value);
1081 case SETUP_TOKEN_ALIAS_NAME:
1082 strncpy(local_player->alias_name, token_value, MAX_NAMELEN-1);
1083 local_player->alias_name[MAX_NAMELEN-1] = '\0';
1087 Error(ERR_WARN, "unknown token '%s' not recognized", token);
1095 decodeSetupFileList(setup_file_list->next);
1101 char filename[MAX_FILENAME_LEN];
1102 struct SetupFileList *setup_file_list = NULL;
1104 /* always start with reliable default setup values */
1106 strncpy(local_player->login_name, GetLoginName(), MAX_NAMELEN-1);
1107 local_player->login_name[MAX_NAMELEN-1] = '\0';
1109 strncpy(local_player->alias_name, GetLoginName(), MAX_NAMELEN-1);
1110 local_player->alias_name[MAX_NAMELEN-1] = '\0';
1112 setup.sound_on = TRUE;
1113 setup.sound_loops_on = FALSE;
1114 setup.sound_music_on = FALSE;
1115 setup.sound_simple_on = FALSE;
1116 setup.toons_on = TRUE;
1117 setup.direct_draw_on = FALSE;
1118 setup.scroll_delay_on = FALSE;
1119 setup.soft_scrolling_on = TRUE;
1120 setup.fading_on = FALSE;
1121 setup.autorecord_on = FALSE;
1122 setup.quick_doors = FALSE;
1124 for (i=0; i<MAX_PLAYERS; i++)
1126 setup.input[i].use_joystick = FALSE;
1127 setup.input[i].joystick_nr = 0;
1128 setup.input[i].joy.snap = (i == 0 ? JOY_BUTTON_1 : 0);
1129 setup.input[i].joy.bomb = (i == 0 ? JOY_BUTTON_2 : 0);
1130 setup.input[i].key.left = (i == 0 ? DEFAULT_KEY_LEFT : KEY_UNDEFINDED);
1131 setup.input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KEY_UNDEFINDED);
1132 setup.input[i].key.up = (i == 0 ? DEFAULT_KEY_UP : KEY_UNDEFINDED);
1133 setup.input[i].key.down = (i == 0 ? DEFAULT_KEY_DOWN : KEY_UNDEFINDED);
1134 setup.input[i].key.snap = (i == 0 ? DEFAULT_KEY_SNAP : KEY_UNDEFINDED);
1135 setup.input[i].key.bomb = (i == 0 ? DEFAULT_KEY_BOMB : KEY_UNDEFINDED);
1138 sprintf(filename, "%s/%s", SETUP_PATH, SETUP_FILENAME);
1140 setup_file_list = loadSetupFileList(filename);
1142 if (setup_file_list)
1146 printSetupFileList(setup_file_list);
1149 checkSetupFileListIdentifier(setup_file_list, SETUP_COOKIE);
1150 decodeSetupFileList(setup_file_list);
1152 freeSetupFileList(setup_file_list);
1155 Error(ERR_RETURN, "using default setup values");
1158 void LoadLevelSetup()
1160 char filename[MAX_FILENAME_LEN];
1162 /* always start with reliable default setup values */
1167 sprintf(filename, "%s/%s", SETUP_PATH, LEVELSETUP_FILENAME);
1169 if (level_setup_list)
1170 freeSetupFileList(level_setup_list);
1172 level_setup_list = loadSetupFileList(filename);
1174 if (level_setup_list)
1178 char *last_level_series =
1179 getSetupFileListEntry(level_setup_list, TOKEN_STR_LAST_LEVEL_SERIES);
1181 if (last_level_series)
1183 for (i=0; i<num_leveldirs; i++)
1185 if (strcmp(last_level_series, leveldir[i].filename) == 0)
1188 getSetupFileListEntry(level_setup_list, last_level_series);
1194 level_nr = atoi(token_value);
1198 if (level_nr > leveldir[leveldir_nr].levels - 1)
1199 level_nr = leveldir[leveldir_nr].levels - 1;
1209 printSetupFileList(level_setup_list);
1212 checkSetupFileListIdentifier(level_setup_list, LEVELSETUP_COOKIE);
1215 Error(ERR_RETURN, "using default setup values");
1221 char filename[MAX_FILENAME_LEN];
1224 sprintf(filename, "%s/%s", SETUP_PATH, SETUP_FILENAME);
1226 if (!(file = fopen(filename, "w")))
1228 Error(ERR_WARN, "cannot write setup file '%s'", filename);
1232 fprintf(file, "%s: %s\n",
1233 TOKEN_STR_FILE_IDENTIFIER, SETUP_COOKIE);
1235 fprintf(file, "\n");
1237 fprintf(file, "%s\n",
1238 getSetupEntry("", SETUP_TOKEN_SOUND,
1240 fprintf(file, "%s\n",
1241 getSetupEntry("", SETUP_TOKEN_SOUND_LOOPS,
1242 setup.sound_loops_on));
1243 fprintf(file, "%s\n",
1244 getSetupEntry("", SETUP_TOKEN_SOUND_MUSIC,
1245 setup.sound_music_on));
1246 fprintf(file, "%s\n",
1247 getSetupEntry("", SETUP_TOKEN_SOUND_SIMPLE,
1248 setup.sound_simple_on));
1249 fprintf(file, "%s\n",
1250 getSetupEntry("", SETUP_TOKEN_TOONS,
1252 fprintf(file, "%s\n",
1253 getSetupEntry("", SETUP_TOKEN_DIRECT_DRAW,
1254 setup.direct_draw_on));
1255 fprintf(file, "%s\n",
1256 getSetupEntry("", SETUP_TOKEN_SCROLL_DELAY,
1257 setup.scroll_delay_on));
1258 fprintf(file, "%s\n",
1259 getSetupEntry("", SETUP_TOKEN_SOFT_SCROLLING,
1260 setup.soft_scrolling_on));
1261 fprintf(file, "%s\n",
1262 getSetupEntry("", SETUP_TOKEN_FADING,
1264 fprintf(file, "%s\n",
1265 getSetupEntry("", SETUP_TOKEN_AUTORECORD,
1266 setup.autorecord_on));
1267 fprintf(file, "%s\n",
1268 getSetupEntry("", SETUP_TOKEN_QUICK_DOORS,
1269 setup.quick_doors));
1271 fprintf(file, "\n");
1273 fprintf(file, "%s\n",
1274 getFormattedSetupEntry(TOKEN_STR_ALIAS_NAME,
1275 local_player->alias_name));
1277 for (i=0; i<MAX_PLAYERS; i++)
1281 sprintf(prefix, "%s%d", TOKEN_STR_PLAYER_PREFIX, i + 1);
1283 fprintf(file, "\n");
1285 fprintf(file, "%s\n",
1286 getSetupEntry(prefix, SETUP_TOKEN_USE_JOYSTICK,
1287 setup.input[i].use_joystick));
1288 fprintf(file, "%s\n",
1289 getSetupEntry(prefix, SETUP_TOKEN_JOYSTICK_NR,
1290 setup.input[i].joystick_nr));
1292 fprintf(file, "%s%s: %s\n", prefix,
1293 getSetupToken(SETUP_TOKEN_JOY_SNAP),
1294 getJoyNameFromJoySymbol(setup.input[i].joy.snap));
1295 fprintf(file, "%s%s: %s\n", prefix,
1296 getSetupToken(SETUP_TOKEN_JOY_BOMB),
1297 getJoyNameFromJoySymbol(setup.input[i].joy.bomb));
1299 fprintf(file, "%s\n",
1300 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_LEFT,
1301 setup.input[i].key.left));
1302 fprintf(file, "%s\n",
1303 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_RIGHT,
1304 setup.input[i].key.right));
1305 fprintf(file, "%s\n",
1306 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_UP,
1307 setup.input[i].key.up));
1308 fprintf(file, "%s\n",
1309 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_DOWN,
1310 setup.input[i].key.down));
1311 fprintf(file, "%s\n",
1312 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_SNAP,
1313 setup.input[i].key.snap));
1314 fprintf(file, "%s\n",
1315 getSetupEntryWithComment(prefix, SETUP_TOKEN_KEY_BOMB,
1316 setup.input[i].key.bomb));
1321 chmod(filename, SETUP_PERMS);
1324 void SaveLevelSetup()
1326 char filename[MAX_FILENAME_LEN];
1327 struct SetupFileList *list_entry = level_setup_list;
1330 updateSetupFileListEntry(level_setup_list,
1331 TOKEN_STR_LAST_LEVEL_SERIES,
1332 leveldir[leveldir_nr].filename);
1334 updateSetupFileListEntry(level_setup_list,
1335 leveldir[leveldir_nr].filename,
1336 int2str(level_nr, 0));
1338 sprintf(filename, "%s/%s", SETUP_PATH, LEVELSETUP_FILENAME);
1340 if (!(file = fopen(filename, "w")))
1342 Error(ERR_WARN, "cannot write setup file '%s'", filename);
1346 fprintf(file, "%s: %s\n\n",
1347 TOKEN_STR_FILE_IDENTIFIER, LEVELSETUP_COOKIE);
1351 if (strcmp(list_entry->token, TOKEN_STR_FILE_IDENTIFIER) != 0)
1352 fprintf(file, "%s\n",
1353 getFormattedSetupEntry(list_entry->token, list_entry->value));
1355 /* just to make things nicer :) */
1356 if (strcmp(list_entry->token, TOKEN_STR_LAST_LEVEL_SERIES) == 0)
1357 fprintf(file, "\n");
1359 list_entry = list_entry->next;
1364 chmod(filename, SETUP_PERMS);