X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=5c4209d7c45ecc5da189f2092765cf38cd4beb70;hb=681df696173f472fe28e49b9e8e01b34dc34629b;hp=7d4dc9d012b3e2648e2cb0d1c4f6f4094a82ba88;hpb=3186a3cfcac48b25b8de9f77c78bc76f932c1e30;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 7d4dc9d0..5c4209d7 100644 --- a/src/files.c +++ b/src/files.c @@ -274,7 +274,7 @@ static struct LevelFileConfigInfo chunk_config_INFO[] = { -1, -1, TYPE_INTEGER, CONF_VALUE_16_BIT(6), - &li.bd_cycle_delay_ms, 200 + &li.bd_cycle_delay_ms, 160 }, { -1, -1, @@ -2929,26 +2929,7 @@ char *getLocalLevelTemplateFilename(void) char *getGlobalLevelTemplateFilename(void) { - // global variable "leveldir_current" must be modified in the loop below - LevelDirTree *leveldir_current_last = leveldir_current; - char *filename = NULL; - - // check for template level in path from current to topmost tree node - - while (leveldir_current != NULL) - { - filename = getDefaultLevelFilename(-1); - - if (fileExists(filename)) - break; - - leveldir_current = leveldir_current->node_parent; - } - - // restore global variable "leveldir_current" modified in above loop - leveldir_current = leveldir_current_last; - - return filename; + return getFilenameFromCurrentLevelDirUpward(LEVELTEMPLATE_FILENAME); } static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi) @@ -7551,6 +7532,66 @@ void LoadLevelFromFilename(struct LevelInfo *level, char *filename) LoadLevelFromFileInfo(level, &level_file_info, FALSE); } +static void LoadLevel_FixEnvelopes(struct LevelInfo *level, boolean skip_single_lines) +{ + // This function removes newlines in envelopes after lines of text ending in the last column + // of the envelope. In earlier versions, these newlines were removed when displaying envelopes, + // but caused trouble in the level editor. In version 4.3.2.3, this problem was partially + // fixed in the level editor (but only for single full-width text lines followed by a newline, + // not for multiple lines ending in the last column, followed by a newline), but now produced + // unwanted newlines in the game for envelopes stored by previous game versions, which was not + // intended by the level author (and sometimes caused text lines not being displayed anymore at + // the bottom of the envelope). + // + // This function should solve these problems by removing such newline characters from envelopes + // stored by older game versions. + + int envelope_nr; + + for (envelope_nr = 0; envelope_nr < NUM_ENVELOPES; envelope_nr++) + { + char *envelope_ptr = level->envelope[envelope_nr].text; + int envelope_xsize = level->envelope[envelope_nr].xsize; + int envelope_size = strlen(envelope_ptr); + int start = 0; + int i; + + for (i = 0; i < envelope_size; i++) + { + // check for newlines in envelope + if (envelope_ptr[i] == '\n') + { + int line_length = i - start; + + // check for (non-empty) lines that are a multiple of the envelope width, + // causing a line break inside the envelope (text area in editor and in game) + if (line_length > 0 && line_length % envelope_xsize == 0) + { + // special case: skip fixing single lines for newer versions + boolean skip_fixing_line = (line_length == 1 && skip_single_lines); + + if (!skip_fixing_line) + { + int j; + + // remove newline character from string + for (j = i; j < envelope_size; j++) + envelope_ptr[j] = envelope_ptr[j + 1]; + } + + // continue with next line (that was copied over the newline) + start = i; + } + else + { + // continue with next character after newline + start = i + 1; + } + } + } + } +} + static void LoadLevel_InitVersion(struct LevelInfo *level) { int i, j; @@ -7742,6 +7783,10 @@ static void LoadLevel_InitVersion(struct LevelInfo *level) // CE changing to player was kept under the player if walkable up to 4.2.3.1 if (level->game_version <= VERSION_IDENT(4,2,3,1)) level->keep_walkable_ce = TRUE; + + // envelopes may contain broken or too many line breaks before 4.4.0.0 + if (level->game_version < VERSION_IDENT(4,4,0,0)) + LoadLevel_FixEnvelopes(level, (level->game_version >= VERSION_IDENT(4,3,2,3))); } static void LoadLevel_InitSettings_SB(struct LevelInfo *level)