X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=d7837486d401d930248e8bfafe7836753027f1fe;hp=2e58ad30240e469571637a99b075a5267d87dd4d;hb=e51177796149f37de339bda83558c3c49758be93;hpb=949580a3bafe5c8abd1fac99202411b65900b883 diff --git a/src/files.c b/src/files.c index 2e58ad30..d7837486 100644 --- a/src/files.c +++ b/src/files.c @@ -6551,7 +6551,7 @@ static void LoadLevelFromFileInfo_SB(struct LevelInfo *level, boolean load_xsb_to_ces = check_special_flags("load_xsb_to_ces"); int file_level_nr = 0; int line_nr = 0; - int x, y; + int x = 0, y = 0; /* initialized to make compilers happy */ #if 0 printf("::: looking for level number %d [%d]\n", @@ -8452,6 +8452,79 @@ static int LoadTape_BODY(FILE *file, int chunk_size, struct TapeInfo *tape) return chunk_size; } +void LoadTape_SokobanSolution(char *filename) +{ + FILE *file; + int move_delay = TILESIZE / level.initial_player_stepsize[0]; + + if (!(file = fopen(filename, MODE_READ))) + { + tape.no_valid_file = TRUE; + + return; + } + + while (!feof(file)) + { + unsigned char c = fgetc(file); + + if (feof(file)) + break; + + switch (c) + { + case 'u': + case 'U': + tape.pos[tape.length].action[0] = MV_UP; + tape.pos[tape.length].delay = move_delay + (c < 'a' ? 2 : 0); + tape.length++; + break; + + case 'd': + case 'D': + tape.pos[tape.length].action[0] = MV_DOWN; + tape.pos[tape.length].delay = move_delay + (c < 'a' ? 2 : 0); + tape.length++; + break; + + case 'l': + case 'L': + tape.pos[tape.length].action[0] = MV_LEFT; + tape.pos[tape.length].delay = move_delay + (c < 'a' ? 2 : 0); + tape.length++; + break; + + case 'r': + case 'R': + tape.pos[tape.length].action[0] = MV_RIGHT; + tape.pos[tape.length].delay = move_delay + (c < 'a' ? 2 : 0); + tape.length++; + break; + + case '\n': + case '\r': + case '\t': + case ' ': + /* ignore white-space characters */ + break; + + default: + tape.no_valid_file = TRUE; + + Error(ERR_WARN, "unsupported Sokoban solution file '%s' ['%d']", filename, c); + + break; + } + } + + fclose(file); + + if (tape.no_valid_file) + return; + + tape.length_seconds = GetTapeLength(); +} + void LoadTapeFromFilename(char *filename) { char cookie[MAX_LINE_LEN]; @@ -8462,6 +8535,13 @@ void LoadTapeFromFilename(char *filename) /* always start with reliable default values */ setTapeInfoToDefaults(); + if (strSuffix(filename, ".sln")) + { + LoadTape_SokobanSolution(filename); + + return; + } + if (!(file = fopen(filename, MODE_READ))) { tape.no_valid_file = TRUE; @@ -8506,6 +8586,7 @@ void LoadTapeFromFilename(char *filename) Error(ERR_WARN, "unsupported version of tape file '%s'", filename); fclose(file); + return; } @@ -9293,6 +9374,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->options.verbose = FALSE; #if defined(CREATE_SPECIAL_EDITION_RND_JUE) + si->toons = FALSE; si->handicap = FALSE; si->fullscreen = TRUE; si->override_level_graphics = AUTO; @@ -9726,6 +9808,16 @@ static void InitMenuDesignSettings_SpecialPreProcessing() menu.enter_screen[i] = menu.enter_screen[GFX_SPECIAL_ARG_DEFAULT]; menu.leave_screen[i] = menu.leave_screen[GFX_SPECIAL_ARG_DEFAULT]; } + + /* special case: initialize "ARG_DEFAULT" values in static default config */ + /* (eg, init "viewport.door_1.MAIN.xyz" from "viewport.door_1.xyz") */ + for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++) + { + viewport.playfield[i] = viewport.playfield[GFX_SPECIAL_ARG_DEFAULT]; + viewport.door_1[i] = viewport.door_1[GFX_SPECIAL_ARG_DEFAULT]; + if (i != GFX_SPECIAL_ARG_EDITOR) /* editor value already initialized */ + viewport.door_2[i] = viewport.door_2[GFX_SPECIAL_ARG_DEFAULT]; + } } static void InitMenuDesignSettings_SpecialPostProcessing() @@ -9863,6 +9955,50 @@ static void LoadMenuDesignSettingsFromFilename(char *filename) value_6); } + /* special case: initialize with default values that may be overwritten */ + /* (eg, init "viewport.door_1.MAIN.xyz" from "viewport.door_1.xyz") */ + for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++) + { + char *token_1 = "viewport.playfield.x"; + char *token_2 = "viewport.playfield.y"; + char *token_3 = "viewport.playfield.width"; + char *token_4 = "viewport.playfield.height"; + char *token_5 = "viewport.playfield.border_size"; + char *token_6 = "viewport.door_1.x"; + char *token_7 = "viewport.door_1.y"; + char *token_8 = "viewport.door_2.x"; + char *token_9 = "viewport.door_2.y"; + char *value_1 = getHashEntry(setup_file_hash, token_1); + char *value_2 = getHashEntry(setup_file_hash, token_2); + char *value_3 = getHashEntry(setup_file_hash, token_3); + char *value_4 = getHashEntry(setup_file_hash, token_4); + char *value_5 = getHashEntry(setup_file_hash, token_5); + char *value_6 = getHashEntry(setup_file_hash, token_6); + char *value_7 = getHashEntry(setup_file_hash, token_7); + char *value_8 = getHashEntry(setup_file_hash, token_8); + char *value_9 = getHashEntry(setup_file_hash, token_9); + + if (value_1 != NULL) + viewport.playfield[i].x = get_token_parameter_value(token_1, value_1); + if (value_2 != NULL) + viewport.playfield[i].y = get_token_parameter_value(token_2, value_2); + if (value_3 != NULL) + viewport.playfield[i].width = get_token_parameter_value(token_3, value_3); + if (value_4 != NULL) + viewport.playfield[i].height = get_token_parameter_value(token_4,value_4); + if (value_5 != NULL) + viewport.playfield[i].border_size = get_token_parameter_value(token_5, + value_5); + if (value_6 != NULL) + viewport.door_1[i].x = get_token_parameter_value(token_6, value_6); + if (value_7 != NULL) + viewport.door_1[i].y = get_token_parameter_value(token_7, value_7); + if (value_8 != NULL) + viewport.door_2[i].x = get_token_parameter_value(token_8, value_8); + if (value_9 != NULL) + viewport.door_2[i].y = get_token_parameter_value(token_9, value_9); + } + /* special case: initialize with default values that may be overwritten */ /* (e.g., init "titlemessage_1.fade_mode" from "[titlemessage].fade_mode") */ for (i = 0; titlemessage_arrays[i].array != NULL; i++) @@ -10199,6 +10335,10 @@ void LoadMusicInfo() if (!music_info_listed(music_file_info, music->filename)) { *new = get_music_file_info(music->filename, i); +#if 0 + if (*new != NULL) + printf(":1: adding '%s' ['%s'] ...\n", (*new)->title, music->filename); +#endif if (*new != NULL) new = &(*new)->next; } @@ -10244,6 +10384,10 @@ void LoadMusicInfo() if (!music_info_listed(music_file_info, basename)) { *new = get_music_file_info(basename, MAP_NOCONF_MUSIC(num_music_noconf)); +#if 0 + if (*new != NULL) + printf(":2: adding '%s' ['%s'] ...\n", (*new)->title, basename); +#endif if (*new != NULL) new = &(*new)->next; }