-
- fclose(file);
-}
-
-void SaveScore(int level_nr)
-{
- int i;
- char *filename = getScoreFilename(level_nr);
- FILE *file;
-
- InitScoreDirectory(leveldir_current->filename);
-
- if (!(file = fopen(filename, "w")))
- {
- Error(ERR_WARN, "cannot save score for level %d", level_nr);
- return;
- }
-
- fprintf(file, "%s\n\n", SCORE_COOKIE);
-
- for(i=0; i<MAX_SCORE_ENTRIES; i++)
- fprintf(file, "%d %s\n", highscore[i].Score, highscore[i].Name);
-
- fclose(file);
-
- chmod(filename, SCORE_PERMS);
-}
-
-#define TOKEN_STR_FILE_IDENTIFIER "file_identifier"
-#define TOKEN_STR_LAST_LEVEL_SERIES "last_level_series"
-#define TOKEN_STR_LAST_PLAYED_LEVEL "last_played_level"
-#define TOKEN_STR_HANDICAP_LEVEL "handicap_level"
-#define TOKEN_STR_PLAYER_PREFIX "player_"
-
-#define TOKEN_VALUE_POSITION 30
-
-/* global setup */
-#define SETUP_TOKEN_PLAYER_NAME 0
-#define SETUP_TOKEN_SOUND 1
-#define SETUP_TOKEN_SOUND_LOOPS 2
-#define SETUP_TOKEN_SOUND_MUSIC 3
-#define SETUP_TOKEN_SOUND_SIMPLE 4
-
-#if 0
-#define SETUP_TOKEN_TOONS 5
-#define SETUP_TOKEN_DOUBLE_BUFFERING 6
-#endif
-
-#define SETUP_TOKEN_SCROLL_DELAY 5
-#define SETUP_TOKEN_SOFT_SCROLLING 6
-#define SETUP_TOKEN_FADING 7
-#define SETUP_TOKEN_AUTORECORD 8
-#define SETUP_TOKEN_QUICK_DOORS 9
-#define SETUP_TOKEN_TEAM_MODE 10
-#define SETUP_TOKEN_HANDICAP 11
-#define SETUP_TOKEN_TIME_LIMIT 12
-
-/* player setup */
-#define SETUP_TOKEN_USE_JOYSTICK 13
-#define SETUP_TOKEN_JOY_DEVICE_NAME 14
-#define SETUP_TOKEN_JOY_XLEFT 15
-#define SETUP_TOKEN_JOY_XMIDDLE 16
-#define SETUP_TOKEN_JOY_XRIGHT 17
-#define SETUP_TOKEN_JOY_YUPPER 18
-#define SETUP_TOKEN_JOY_YMIDDLE 19
-#define SETUP_TOKEN_JOY_YLOWER 20
-#define SETUP_TOKEN_JOY_SNAP 21
-#define SETUP_TOKEN_JOY_BOMB 22
-#define SETUP_TOKEN_KEY_LEFT 23
-#define SETUP_TOKEN_KEY_RIGHT 24
-#define SETUP_TOKEN_KEY_UP 25
-#define SETUP_TOKEN_KEY_DOWN 26
-#define SETUP_TOKEN_KEY_SNAP 27
-#define SETUP_TOKEN_KEY_BOMB 28
-
-/* level directory info */
-#define LEVELINFO_TOKEN_NAME 29
-#define LEVELINFO_TOKEN_NAME_SHORT 30
-#define LEVELINFO_TOKEN_NAME_SORTING 31
-#define LEVELINFO_TOKEN_AUTHOR 32
-#define LEVELINFO_TOKEN_IMPORTED_FROM 33
-#define LEVELINFO_TOKEN_LEVELS 34
-#define LEVELINFO_TOKEN_FIRST_LEVEL 35
-#define LEVELINFO_TOKEN_SORT_PRIORITY 36
-#define LEVELINFO_TOKEN_LEVEL_GROUP 37
-#define LEVELINFO_TOKEN_READONLY 38
-
-#define FIRST_GLOBAL_SETUP_TOKEN SETUP_TOKEN_PLAYER_NAME
-#define LAST_GLOBAL_SETUP_TOKEN SETUP_TOKEN_TIME_LIMIT
-
-#define FIRST_PLAYER_SETUP_TOKEN SETUP_TOKEN_USE_JOYSTICK
-#define LAST_PLAYER_SETUP_TOKEN SETUP_TOKEN_KEY_BOMB
-
-#define FIRST_LEVELINFO_TOKEN LEVELINFO_TOKEN_NAME
-#define LAST_LEVELINFO_TOKEN LEVELINFO_TOKEN_READONLY
-
-#define TYPE_BOOLEAN 1
-#define TYPE_SWITCH 2
-#define TYPE_KEYSYM 3
-#define TYPE_INTEGER 4
-#define TYPE_STRING 5
-
-static struct SetupInfo si;
-static struct SetupInputInfo sii;
-static struct LevelDirInfo ldi;
-static struct
-{
- int type;
- void *value;
- char *text;
-} token_info[] =
-{
- /* global setup */
- { TYPE_STRING, &si.player_name, "player_name" },
- { TYPE_SWITCH, &si.sound, "sound" },
- { TYPE_SWITCH, &si.sound_loops, "repeating_sound_loops" },
- { TYPE_SWITCH, &si.sound_music, "background_music" },
- { TYPE_SWITCH, &si.sound_simple, "simple_sound_effects" },
-
-#if 0
- { TYPE_SWITCH, &si.toons, "toons" },
- { TYPE_SWITCH, &si.double_buffering, "double_buffering" },
-#endif
-
- { TYPE_SWITCH, &si.scroll_delay, "scroll_delay" },
- { TYPE_SWITCH, &si.soft_scrolling, "soft_scrolling" },
- { TYPE_SWITCH, &si.fading, "screen_fading" },
- { TYPE_SWITCH, &si.autorecord, "automatic_tape_recording" },
- { TYPE_SWITCH, &si.quick_doors, "quick_doors" },
- { TYPE_SWITCH, &si.team_mode, "team_mode" },
- { TYPE_SWITCH, &si.handicap, "handicap" },
- { TYPE_SWITCH, &si.time_limit, "time_limit" },
-
- /* player setup */
- { TYPE_BOOLEAN, &sii.use_joystick, ".use_joystick" },
- { TYPE_STRING, &sii.joy.device_name, ".joy.device_name" },
- { TYPE_INTEGER, &sii.joy.xleft, ".joy.xleft" },
- { TYPE_INTEGER, &sii.joy.xmiddle, ".joy.xmiddle" },
- { TYPE_INTEGER, &sii.joy.xright, ".joy.xright" },
- { TYPE_INTEGER, &sii.joy.yupper, ".joy.yupper" },
- { TYPE_INTEGER, &sii.joy.ymiddle, ".joy.ymiddle" },
- { TYPE_INTEGER, &sii.joy.ylower, ".joy.ylower" },
- { TYPE_INTEGER, &sii.joy.snap, ".joy.snap_field" },
- { TYPE_INTEGER, &sii.joy.bomb, ".joy.place_bomb" },
- { TYPE_KEYSYM, &sii.key.left, ".key.move_left" },
- { TYPE_KEYSYM, &sii.key.right, ".key.move_right" },
- { TYPE_KEYSYM, &sii.key.up, ".key.move_up" },
- { TYPE_KEYSYM, &sii.key.down, ".key.move_down" },
- { TYPE_KEYSYM, &sii.key.snap, ".key.snap_field" },
- { TYPE_KEYSYM, &sii.key.bomb, ".key.place_bomb" },
-
- /* level directory info */
- { TYPE_STRING, &ldi.name, "name" },
- { TYPE_STRING, &ldi.name_short, "name_short" },
- { TYPE_STRING, &ldi.name_sorting, "name_sorting" },
- { TYPE_STRING, &ldi.author, "author" },
- { TYPE_STRING, &ldi.imported_from, "imported_from" },
- { TYPE_INTEGER, &ldi.levels, "levels" },
- { TYPE_INTEGER, &ldi.first_level, "first_level" },
- { TYPE_INTEGER, &ldi.sort_priority, "sort_priority" },
- { TYPE_BOOLEAN, &ldi.level_group, "level_group" },
- { TYPE_BOOLEAN, &ldi.readonly, "readonly" }
-};
-
-static char *string_tolower(char *s)
-{
- static char s_lower[100];
- int i;
-
- if (strlen(s) >= 100)
- return s;
-
- strcpy(s_lower, s);
-
- for (i=0; i<strlen(s_lower); i++)
- s_lower[i] = tolower(s_lower[i]);
-
- return s_lower;
-}
-
-static int get_string_integer_value(char *s)
-{
- static char *number_text[][3] =
- {
- { "0", "zero", "null", },
- { "1", "one", "first" },
- { "2", "two", "second" },
- { "3", "three", "third" },
- { "4", "four", "fourth" },
- { "5", "five", "fifth" },
- { "6", "six", "sixth" },
- { "7", "seven", "seventh" },
- { "8", "eight", "eighth" },
- { "9", "nine", "ninth" },
- { "10", "ten", "tenth" },
- { "11", "eleven", "eleventh" },
- { "12", "twelve", "twelfth" },
- };
-
- int i, j;
-
- for (i=0; i<13; i++)
- for (j=0; j<3; j++)
- if (strcmp(string_tolower(s), number_text[i][j]) == 0)
- return i;
-
- return atoi(s);
-}
-
-static boolean get_string_boolean_value(char *s)
-{
- if (strcmp(string_tolower(s), "true") == 0 ||
- strcmp(string_tolower(s), "yes") == 0 ||
- strcmp(string_tolower(s), "on") == 0 ||
- get_string_integer_value(s) == 1)
- return TRUE;
- else
- return FALSE;
-}
-
-static char *getFormattedSetupEntry(char *token, char *value)
-{
- int i;
- static char entry[MAX_LINE_LEN];
-
- sprintf(entry, "%s:", token);
- for (i=strlen(entry); i<TOKEN_VALUE_POSITION; i++)
- entry[i] = ' ';
- entry[i] = '\0';
-
- strcat(entry, value);
-
- return entry;
-}
-
-static void freeSetupFileList(struct SetupFileList *setup_file_list)
-{
- if (!setup_file_list)
- return;
-
- if (setup_file_list->token)
- free(setup_file_list->token);
- if (setup_file_list->value)
- free(setup_file_list->value);
- if (setup_file_list->next)
- freeSetupFileList(setup_file_list->next);
- free(setup_file_list);
-}
-
-static struct SetupFileList *newSetupFileList(char *token, char *value)
-{
- struct SetupFileList *new = checked_malloc(sizeof(struct SetupFileList));
-
- new->token = checked_malloc(strlen(token) + 1);
- strcpy(new->token, token);
-
- new->value = checked_malloc(strlen(value) + 1);
- strcpy(new->value, value);
-
- new->next = NULL;
-
- return new;
-}
-
-static char *getTokenValue(struct SetupFileList *setup_file_list,
- char *token)
-{
- if (!setup_file_list)
- return NULL;
-
- if (strcmp(setup_file_list->token, token) == 0)
- return setup_file_list->value;