X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=15264d2d4e3a6eeea4f12a875469f3496d01dc16;hb=6ed4958820f8f97174ca47594dcc6f00ee31b2cb;hp=2f031820dcfc2d60c458b2676ddd6c0e05b6a08d;hpb=3fb68b18f28034e492534fb3b5579fd1da888292;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 2f031820..15264d2d 100644 --- a/src/files.c +++ b/src/files.c @@ -872,6 +872,26 @@ static int LoadTape_HEAD(FILE *file, int chunk_size, struct TapeInfo *tape) return chunk_size; } +static int LoadTape_INFO(FILE *file, int chunk_size, struct TapeInfo *tape) +{ + int level_identifier_size; + int i; + + level_identifier_size = getFile16BitBE(file); + + tape->level_identifier = + checked_realloc(tape->level_identifier, level_identifier_size); + + for(i=0; i < level_identifier_size; i++) + tape->level_identifier[i] = fgetc(file); + + tape->level_nr = getFile16BitBE(file); + + chunk_size = 2 + level_identifier_size + 2; + + return chunk_size; +} + static int LoadTape_BODY(FILE *file, int chunk_size, struct TapeInfo *tape) { int i, j; @@ -1025,6 +1045,7 @@ void LoadTapeFromFilename(char *filename) { { "VERS", FILE_VERS_CHUNK_SIZE, LoadTape_VERS }, { "HEAD", TAPE_HEADER_SIZE, LoadTape_HEAD }, + { "INFO", -1, LoadTape_INFO }, { "BODY", -1, LoadTape_BODY }, { NULL, 0, NULL } }; @@ -1108,6 +1129,19 @@ static void SaveTape_HEAD(FILE *file, struct TapeInfo *tape) putFileVersion(file, tape->engine_version); } +static void SaveTape_INFO(FILE *file, struct TapeInfo *tape) +{ + int level_identifier_size = strlen(tape->level_identifier) + 1; + int i; + + putFile16BitBE(file, level_identifier_size); + + for(i=0; i < level_identifier_size; i++) + fputc(tape->level_identifier[i], file); + + putFile16BitBE(file, tape->level_nr); +} + static void SaveTape_BODY(FILE *file, struct TapeInfo *tape) { int i, j; @@ -1124,12 +1158,13 @@ static void SaveTape_BODY(FILE *file, struct TapeInfo *tape) void SaveTape(int level_nr) { - int i; char *filename = getTapeFilename(level_nr); FILE *file; boolean new_tape = TRUE; int num_participating_players = 0; + int info_chunk_size; int body_chunk_size; + int i; InitTapeDirectory(leveldir_current->filename); @@ -1155,6 +1190,7 @@ void SaveTape(int level_nr) if (tape.player_participates[i]) num_participating_players++; + info_chunk_size = 2 + (strlen(tape.level_identifier) + 1) + 2; body_chunk_size = (num_participating_players + 1) * tape.length; putFileChunkBE(file, "RND1", CHUNK_SIZE_UNDEFINED); @@ -1166,6 +1202,9 @@ void SaveTape(int level_nr) putFileChunkBE(file, "HEAD", TAPE_HEADER_SIZE); SaveTape_HEAD(file, &tape); + putFileChunkBE(file, "INFO", info_chunk_size); + SaveTape_INFO(file, &tape); + putFileChunkBE(file, "BODY", body_chunk_size); SaveTape_BODY(file, &tape); @@ -1192,6 +1231,7 @@ void DumpTape(struct TapeInfo *tape) printf_line("-", 79); printf("Tape of Level %03d (file version %06d, game version %06d)\n", tape->level_nr, tape->file_version, tape->game_version); + printf("Level series identifier: '%s'\n", tape->level_identifier); printf_line("-", 79); for(i=0; ilength; i++) @@ -1475,11 +1515,26 @@ static struct TokenInfo options_setup_tokens[] = { TYPE_BOOLEAN, &soi.verbose, "options.verbose" } }; +static char *get_corrected_login_name(char *login_name) +{ + /* needed because player name must be a fixed length string */ + char *login_name_new = checked_malloc(MAX_PLAYER_NAME_LEN + 1); + + strncpy(login_name_new, login_name, MAX_PLAYER_NAME_LEN); + login_name_new[MAX_PLAYER_NAME_LEN] = '\0'; + + if (strlen(login_name) > MAX_PLAYER_NAME_LEN) /* name has been cut */ + if (strchr(login_name_new, ' ')) + *strchr(login_name_new, ' ') = '\0'; + + return login_name_new; +} + static void setSetupInfoToDefaults(struct SetupInfo *si) { int i; - si->player_name = getStringCopy(getLoginName()); + si->player_name = get_corrected_login_name(getLoginName()); si->sound = TRUE; si->sound_loops = TRUE; @@ -1620,6 +1675,8 @@ void LoadSetup() if (setup_file_list) { + char *player_name_new; + checkSetupFileListIdentifier(setup_file_list, getCookie("SETUP")); decodeSetupFileList(setup_file_list); @@ -1628,16 +1685,9 @@ void LoadSetup() freeSetupFileList(setup_file_list); /* needed to work around problems with fixed length strings */ - if (strlen(setup.player_name) > MAX_PLAYER_NAME_LEN) - setup.player_name[MAX_PLAYER_NAME_LEN] = '\0'; - else if (strlen(setup.player_name) < MAX_PLAYER_NAME_LEN) - { - char *new_name = checked_malloc(MAX_PLAYER_NAME_LEN + 1); - - strcpy(new_name, setup.player_name); - free(setup.player_name); - setup.player_name = new_name; - } + player_name_new = get_corrected_login_name(setup.player_name); + free(setup.player_name); + setup.player_name = player_name_new; } else Error(ERR_WARN, "using default setup values");