X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=21ed3ca17f8614be3770784740da65e1be5baf7c;hb=2357c391b4a587709627cc30316734b3c83c8134;hp=a77b4463660c5821680defce31430e15ed4d09b7;hpb=d7d97176a88ee47f893055480c76b9c05a253d05;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index a77b4463..21ed3ca1 100644 --- a/src/files.c +++ b/src/files.c @@ -19,61 +19,6 @@ #include "tape.h" #include "joystick.h" -boolean CreateNewScoreFile() -{ - int i,j,k; - char filename[MAX_FILENAME_LEN]; - char empty_alias[MAX_NAMELEN]; - FILE *file; - - sprintf(filename,"%s/%s/%s", - level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME); - - if (!(file=fopen(filename,"w"))) - return(FALSE); - - for(i=0;ileveldir_nr < num_leveldirs) - leveldir_nr = local_player->leveldir_nr; - else - leveldir_nr = 0; - } - else - { - local_player->handicap = new_player.handicap; - local_player->level_nr = new_player.level_nr; - } - - level_nr = local_player->level_nr; - - if (file) - fclose(file); -} - -void SaveLevel(int level_nr) -{ - int i,x,y; - char filename[MAX_FILENAME_LEN]; - FILE *file; - - sprintf(filename,"%s/%s/%d", - level_directory,leveldir[leveldir_nr].filename,level_nr); - - if (!(file=fopen(filename,"w"))) - { - Error(ERR_RETURN, "cannot save level file '%s'", filename); - return; - } - - fputs(LEVEL_COOKIE,file); /* Formatkennung */ - fputc(0x0a,file); - - fputc(level.fieldx,file); - fputc(level.fieldy,file); - fputc(level.time / 256,file); - fputc(level.time % 256,file); - fputc(level.edelsteine / 256,file); - fputc(level.edelsteine % 256,file); - - for(i=0;ilogin_name, MAX_NAMELEN-1)) - { - fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR); - break; - } } +} - local_player->level_nr = level_nr; +void SaveScore(int level_nr) +{ + int i,j; + char filename[MAX_FILENAME_LEN]; + FILE *file; - for(i=0;ilogin_name[i],file); - for(i=0;ialias_name[i],file); - fputc(local_player->handicap,file); - fputc(local_player->setup / 256,file); - fputc(local_player->setup % 256,file); - fputc(local_player->leveldir_nr,file); - if (!version_10_file) + sprintf(filename,"%s/%s/%s", + level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME); + + if (!(file=fopen(filename,"r+"))) { - fputc(local_player->level_nr,file); - for(i=0;i<10;i++) /* currently unused bytes */ - fputc(0,file); + Error(ERR_WARN, "cannot save score for level %d", level_nr); + return; } + fseek(file, + SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)), + SEEK_SET); + for(i=0;itoken) - free(setup_file_info->token); - if (setup_file_info->value) - free(setup_file_info->value); - if (setup_file_info->next) - freeSetupFileInfo(setup_file_info->next); - free(setup_file_info); + 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 SetupFileInfo *newSetupFileInfo(char *token, char *value) +static struct SetupFileList *newSetupFileList(char *token, char *value) { - struct SetupFileInfo *new = checked_malloc(sizeof(struct SetupFileInfo)); + struct SetupFileList *new = checked_malloc(sizeof(struct SetupFileList)); new->token = checked_malloc(strlen(token) + 1); strcpy(new->token, token); @@ -973,53 +827,203 @@ static struct SetupFileInfo *newSetupFileInfo(char *token, char *value) return new; } -static char *lookupSetupFileValue(struct SetupFileInfo *setup_file_info, - char *token) +static char *getSetupFileListEntry(struct SetupFileList *setup_file_list, + char *token) { - if (!setup_file_info) + if (!setup_file_list) return NULL; - if (strcmp(setup_file_info->token, token) == 0) - return setup_file_info->value; + if (strcmp(setup_file_list->token, token) == 0) + return setup_file_list->value; + else + return getSetupFileListEntry(setup_file_list->next, token); +} + +boolean setSetupFileListEntry(struct SetupFileList *setup_file_list, + char *token, char *value) +{ + if (!setup_file_list) + return FALSE; + + if (strcmp(setup_file_list->token, token) == 0) + { + free(setup_file_list->value); + setup_file_list->value = checked_malloc(strlen(value) + 1); + strcpy(setup_file_list->value, value); + + return TRUE; + } + else + return setSetupFileListEntry(setup_file_list->next, token, value); +} + +void updateSetupFileListEntry(struct SetupFileList *setup_file_list, + char *token, char *value) +{ + if (!setup_file_list) + return; + + if (getSetupFileListEntry(setup_file_list, token) != NULL) + setSetupFileListEntry(setup_file_list, token, value); else - return lookupSetupFileValue(setup_file_info->next, token); + { + struct SetupFileList *list_entry = setup_file_list; + + while (list_entry->next) + list_entry = list_entry->next; + + list_entry->next = newSetupFileList(token, value); + } } #ifdef DEBUG -static void printSetupFileInfo(struct SetupFileInfo *setup_file_info) +static void printSetupFileList(struct SetupFileList *setup_file_list) { - if (!setup_file_info) + if (!setup_file_list) return; - printf("token: '%s'\n", setup_file_info->token); - printf("value: '%s'\n", setup_file_info->value); + printf("token: '%s'\n", setup_file_list->token); + printf("value: '%s'\n", setup_file_list->value); - printSetupFileInfo(setup_file_info->next); + printSetupFileList(setup_file_list->next); } #endif -static void decodeSetupFileInfo(struct SetupFileInfo *setup_file_info) +static struct SetupFileList *loadSetupFileList(char *filename) +{ + int line_len; + char line[MAX_LINE_LEN]; + char *token, *value, *line_ptr; + struct SetupFileList *setup_file_list = newSetupFileList("", ""); + struct SetupFileList *first_valid_list_entry; + + FILE *file; + + if (!(file = fopen(filename, "r"))) + { + Error(ERR_WARN, "cannot open setup file '%s'", filename); + return NULL; + } + + while(!feof(file)) + { + /* read next line of input file */ + if (!fgets(line, MAX_LINE_LEN, file)) + break; + + /* cut trailing comment or whitespace from input line */ + for (line_ptr = line; *line_ptr; line_ptr++) + { + if (*line_ptr == '#' || *line_ptr == '\n') + { + *line_ptr = '\0'; + break; + } + } + + /* cut trailing whitespaces from input line */ + for (line_ptr = &line[strlen(line)]; line_ptr > line; line_ptr--) + if ((*line_ptr == ' ' || *line_ptr == '\t') && line_ptr[1] == '\0') + *line_ptr = '\0'; + + /* ignore empty lines */ + if (*line == '\0') + continue; + + line_len = strlen(line); + + /* cut leading whitespaces from token */ + for (token = line; *token; token++) + if (*token != ' ' && *token != '\t') + break; + + /* find end of token */ + for (line_ptr = token; *line_ptr; line_ptr++) + { + if (*line_ptr == ' ' || *line_ptr == '\t' || *line_ptr == ':') + { + *line_ptr = '\0'; + break; + } + } + + if (line_ptr < line + line_len) + value = line_ptr + 1; + else + value = "\0"; + + /* cut leading whitespaces from value */ + for (; *value; value++) + if (*value != ' ' && *value != '\t') + break; + + if (*token && *value) + updateSetupFileListEntry(setup_file_list, token, value); + } + + fclose(file); + + first_valid_list_entry = setup_file_list->next; + + /* free empty list header */ + setup_file_list->next = NULL; + freeSetupFileList(setup_file_list); + + if (!first_valid_list_entry) + Error(ERR_WARN, "setup file is empty"); + + return first_valid_list_entry; +} + +static void checkSetupFileListIdentifier(struct SetupFileList *setup_file_list, + char *identifier) +{ + if (!setup_file_list) + return; + + if (strcmp(setup_file_list->token, TOKEN_STR_FILE_IDENTIFIER) == 0) + { + if (strcmp(setup_file_list->value, identifier) != 0) + { + Error(ERR_WARN, "setup file has wrong version"); + return; + } + else + return; + } + + if (setup_file_list->next) + checkSetupFileListIdentifier(setup_file_list->next, identifier); + else + { + Error(ERR_WARN, "setup file has no version information"); + return; + } +} + +static void decodeSetupFileList(struct SetupFileList *setup_file_list) { int i; - int token_nr = -1; + int token_nr = TOKEN_INVALID; int player_nr = 0; char *token; char *token_value; - int token_integer_value; boolean token_boolean_value; + int token_integer_value; int token_player_prefix_len; - if (!setup_file_info) + if (!setup_file_list) return; - token = setup_file_info->token; - token_value = setup_file_info->value; - token_integer_value = get_string_integer_value(token_value); + token = setup_file_list->token; + token_value = setup_file_list->value; token_boolean_value = get_string_boolean_value(token_value); + token_integer_value = get_string_integer_value(token_value); - token_player_prefix_len = strlen(SETUP_TOKEN_PLAYER_PREFIX); + token_player_prefix_len = strlen(TOKEN_STR_PLAYER_PREFIX); - if (strncmp(token, SETUP_TOKEN_PLAYER_PREFIX, token_player_prefix_len) == 0) + if (strncmp(token, TOKEN_STR_PLAYER_PREFIX, + token_player_prefix_len) == 0) { token += token_player_prefix_len; @@ -1032,75 +1036,89 @@ static void decodeSetupFileInfo(struct SetupFileInfo *setup_file_info) for (i=0; i 1) - token_integer_value = 1; - setup.input[player_nr].joystick_nr = token_integer_value - 1; + case SETUP_TOKEN_JOY_DEVICE_NAME: + strncpy(setup.input[player_nr].joy.device_name, token_value, + MAX_FILENAME_LEN-1); + setup.input[player_nr].joy.device_name[MAX_FILENAME_LEN-1] = '\0'; break; case SETUP_TOKEN_JOY_SNAP: setup.input[player_nr].joy.snap = getJoySymbolFromJoyName(token_value); break; - case SETUP_TOKEN_JOY_BOMB : + case SETUP_TOKEN_JOY_XLEFT: + setup.input[player_nr].joy.xleft = token_integer_value; + break; + case SETUP_TOKEN_JOY_XMIDDLE: + setup.input[player_nr].joy.xmiddle = token_integer_value; + break; + case SETUP_TOKEN_JOY_XRIGHT: + setup.input[player_nr].joy.xright = token_integer_value; + break; + case SETUP_TOKEN_JOY_YUPPER: + setup.input[player_nr].joy.yupper = token_integer_value; + break; + case SETUP_TOKEN_JOY_YMIDDLE: + setup.input[player_nr].joy.ymiddle = token_integer_value; + break; + case SETUP_TOKEN_JOY_YLOWER: + setup.input[player_nr].joy.ylower = token_integer_value; + break; + case SETUP_TOKEN_JOY_BOMB: setup.input[player_nr].joy.bomb = getJoySymbolFromJoyName(token_value); break; case SETUP_TOKEN_KEY_LEFT: @@ -1121,165 +1139,129 @@ static void decodeSetupFileInfo(struct SetupFileInfo *setup_file_info) case SETUP_TOKEN_KEY_BOMB: setup.input[player_nr].key.bomb = getKeySymFromX11KeyName(token_value); break; + + case TOKEN_INVALID: + Error(ERR_WARN, "unknown token '%s' not recognized", token); + break; + + case TOKEN_IGNORE: default: break; } - decodeSetupFileInfo(setup_file_info->next); + decodeSetupFileList(setup_file_list->next); } -void LoadSetup() +int getLevelSeriesNrFromLevelSeriesName(char *level_series_name) { - int line_len; - char filename[MAX_FILENAME_LEN]; - char line[MAX_LINE_LEN]; - char *token, *value, *line_ptr; - struct SetupFileInfo *setup_file_info, **next_entry = &setup_file_info; - FILE *file; + int i; + if (!level_series_name) + return 0; + for (i=0; i highest_level_nr) + last_level_nr = highest_level_nr; } + return last_level_nr; +} +void LoadSetup() +{ + int i; + char filename[MAX_FILENAME_LEN]; + struct SetupFileList *setup_file_list = NULL; + + /* always start with reliable default setup values */ + + setup.sound = TRUE; + setup.sound_loops = FALSE; + setup.sound_music = FALSE; + setup.sound_simple = FALSE; + setup.toons = TRUE; + setup.double_buffering = TRUE; + setup.direct_draw = !setup.double_buffering; + setup.scroll_delay = FALSE; + setup.soft_scrolling = TRUE; + setup.fading = FALSE; + setup.autorecord = FALSE; + setup.quick_doors = FALSE; + + strncpy(setup.login_name, GetLoginName(), MAX_NAMELEN-1); + setup.login_name[MAX_NAMELEN-1] = '\0'; + strncpy(setup.alias_name, GetLoginName(), MAX_NAMELEN-1); + setup.alias_name[MAX_NAMELEN-1] = '\0'; - /* - next_entry = &setup_file; - */ - - - - while(!feof(file)) + for (i=0; i line; line_ptr--) - if ((*line_ptr == ' ' || *line_ptr == '\t') && line_ptr[1] == '\0') - *line_ptr = '\0'; - - /* ignore empty lines */ - if (*line == '\0') - continue; - - line_len = strlen(line); - - - /* - printf("line: '%s'\n", line); - */ - - - /* cut leading whitespaces from token */ - for (token = line; *token; token++) - if (*token != ' ' && *token != '\t') - break; - - /* find end of token */ - for (line_ptr = token; *line_ptr; line_ptr++) - { - if (*line_ptr == ' ' || *line_ptr == '\t' || *line_ptr == ':') - { - *line_ptr = '\0'; - break; - } - } - - if (line_ptr < line + line_len) - value = line_ptr + 1; - else - value = "\0"; - - /* cut leading whitespaces from value */ - for (; *value; value++) - if (*value != ' ' && *value != '\t') - break; - - - /* - printf("token / value: '%s' / '%s'\n", token, value); - */ - + setup.input[i].use_joystick = FALSE; + strcpy(setup.input[i].joy.device_name, joystick_device_name[i]); + setup.input[i].joy.xleft = JOYSTICK_XLEFT; + setup.input[i].joy.xmiddle = JOYSTICK_XMIDDLE; + setup.input[i].joy.xright = JOYSTICK_XRIGHT; + setup.input[i].joy.yupper = JOYSTICK_YUPPER; + setup.input[i].joy.ymiddle = JOYSTICK_YMIDDLE; + setup.input[i].joy.ylower = JOYSTICK_YLOWER; + setup.input[i].joy.snap = (i == 0 ? JOY_BUTTON_1 : 0); + setup.input[i].joy.bomb = (i == 0 ? JOY_BUTTON_2 : 0); + setup.input[i].key.left = (i == 0 ? DEFAULT_KEY_LEFT : KEY_UNDEFINDED); + setup.input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KEY_UNDEFINDED); + setup.input[i].key.up = (i == 0 ? DEFAULT_KEY_UP : KEY_UNDEFINDED); + setup.input[i].key.down = (i == 0 ? DEFAULT_KEY_DOWN : KEY_UNDEFINDED); + setup.input[i].key.snap = (i == 0 ? DEFAULT_KEY_SNAP : KEY_UNDEFINDED); + setup.input[i].key.bomb = (i == 0 ? DEFAULT_KEY_BOMB : KEY_UNDEFINDED); + } - if (*token && *value) - { - /* allocate new token/value pair */ + sprintf(filename, "%s/%s", SETUP_PATH, SETUP_FILENAME); - *next_entry = newSetupFileInfo(token, value); - next_entry = &((*next_entry)->next); - } - } + setup_file_list = loadSetupFileList(filename); - fclose(file); + if (setup_file_list) + { #if 0 - printf("Content of setup file info:\n"); - - printSetupFileInfo(setup_file_info); + printSetupFileList(setup_file_list); #endif + checkSetupFileListIdentifier(setup_file_list, SETUP_COOKIE); + decodeSetupFileList(setup_file_list); + setup.direct_draw = !setup.double_buffering; - printf("decodeSetupFileInfo\n"); - + freeSetupFileList(setup_file_list); + } + else + Error(ERR_WARN, "using default setup values"); +} - decodeSetupFileInfo(setup_file_info); - freeSetupFileInfo(setup_file_info); -} +#if 0 void SaveSetup() { @@ -1287,74 +1269,93 @@ void SaveSetup() char filename[MAX_FILENAME_LEN]; FILE *file; - - - printf("SaveSetup\n"); - - - sprintf(filename, "%s/%s", SETUP_PATH, SETUP_FILENAME); if (!(file = fopen(filename, "w"))) { - Error(ERR_RETURN, "cannot write setup file '%s'", filename); + Error(ERR_WARN, "cannot write setup file '%s'", filename); return; } - fprintf(file, "file_identifier: %s\n", - SETUP_COOKIE); + fprintf(file, "%s: %s\n", + TOKEN_STR_FILE_IDENTIFIER, SETUP_COOKIE); fprintf(file, "\n"); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_SOUND, - setup.sound_on)); + setup.sound)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_SOUND_LOOPS, - setup.sound_loops_on)); + setup.sound_loops)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_SOUND_MUSIC, - setup.sound_music_on)); + setup.sound_music)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_SOUND_SIMPLE, - setup.sound_simple_on)); + setup.sound_simple)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_TOONS, - setup.toons_on)); + setup.toons)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_DIRECT_DRAW, - setup.direct_draw_on)); + setup.direct_draw)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_SCROLL_DELAY, - setup.scroll_delay_on)); + setup.scroll_delay)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_SOFT_SCROLLING, - setup.soft_scrolling_on)); + setup.soft_scrolling)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_FADING, - setup.fading_on)); + setup.fading)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_AUTORECORD, - setup.autorecord_on)); + setup.autorecord)); fprintf(file, "%s\n", getSetupEntry("", SETUP_TOKEN_QUICK_DOORS, setup.quick_doors)); + fprintf(file, "\n"); + + fprintf(file, "%s\n", + getFormattedSetupEntry(TOKEN_STR_ALIAS_NAME, + setup.alias_name)); + for (i=0; itoken, TOKEN_STR_FILE_IDENTIFIER) != 0) + fprintf(file, "%s\n", + getFormattedSetupEntry(list_entry->token, list_entry->value)); + + /* just to make things nicer :) */ + if (strcmp(list_entry->token, TOKEN_STR_LAST_LEVEL_SERIES) == 0) + fprintf(file, "\n"); + + list_entry = list_entry->next; + } + + fclose(file); + chmod(filename, SETUP_PERMS); }