X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=6ef48aee97da2ced884db8f8a24a540967fe1740;hb=401f78b66d66488fe465945bef36b10faa6b55ef;hp=bd1666398cde9cd10e8a874aa4cf7b08a72e5167;hpb=5500133caf57ac0d86b85c53b5fe38c466d65447;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index bd166639..6ef48aee 100644 --- a/src/init.c +++ b/src/init.c @@ -39,7 +39,7 @@ #define CONFIG_TOKEN_GLOBAL_BUSY "global.busy" #define DEBUG_PRINT_INIT_TIMESTAMPS TRUE -#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH 5 +#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH 1 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS]; @@ -89,47 +89,72 @@ static int copy_properties[][5] = }; -static void print_init_timestamp(char *message) +static void print_timestamp_ext(char *message, char *mode) { #if DEBUG #if DEBUG_PRINT_INIT_TIMESTAMPS + static char *debug_message = NULL; static char *last_message = NULL; static int counter_nr = 0; int max_depth = DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH; - if (strEqualPrefix(message, "INIT")) + checked_free(debug_message); + debug_message = getStringCat3(mode, " ", message); + + if (strEqual(mode, "INIT")) { + debug_print_timestamp(counter_nr, NULL); + if (counter_nr + 1 < max_depth) - { - debug_print_timestamp(counter_nr, NULL); - debug_print_timestamp(counter_nr, message); - } + debug_print_timestamp(counter_nr, debug_message); counter_nr++; debug_print_timestamp(counter_nr, NULL); } - else if (strEqualPrefix(message, "DONE")) + else if (strEqual(mode, "DONE")) { counter_nr--; - if (counter_nr + 1 < max_depth) + if (counter_nr + 1 < max_depth || + (counter_nr == 0 && max_depth == 1)) { - last_message = &message[4]; + last_message = message; - debug_print_timestamp(counter_nr, message); + if (counter_nr == 0 && max_depth == 1) + { + checked_free(debug_message); + debug_message = getStringCat3("TIME", " ", message); + } + + debug_print_timestamp(counter_nr, debug_message); } } - else if (!strEqualPrefix(message, "TIME") || - !strEqualSuffix(message, last_message)) + else if (!strEqual(mode, "TIME") || + !strEqual(message, last_message)) { if (counter_nr < max_depth) - debug_print_timestamp(counter_nr, message); + debug_print_timestamp(counter_nr, debug_message); } #endif #endif } +static void print_timestamp_init(char *message) +{ + print_timestamp_ext(message, "INIT"); +} + +static void print_timestamp_time(char *message) +{ + print_timestamp_ext(message, "TIME"); +} + +static void print_timestamp_done(char *message) +{ + print_timestamp_ext(message, "DONE"); +} + void DrawInitAnim() { struct GraphicInfo *graphic_info_last = graphic_info; @@ -139,6 +164,9 @@ void DrawInitAnim() int sync_frame = FrameCounter; int x, y; + if (game_status != GAME_MODE_LOADING) + return; + if (anim_initial.bitmap == NULL || window == NULL) return; @@ -173,24 +201,41 @@ void DrawInitAnim() y = WIN_YSIZE / 2 - TILESIZE / 2; #endif + graphic_info = &anim_initial; /* graphic == 0 => anim_initial */ + #if 0 { static boolean done = FALSE; - if (!done) - printf("::: %d, %d, %d, %d => %d, %d\n", + // if (!done) + printf("::: %d, %d, %d, %d => %d, %d [%d, %d] [%d, %d]\n", init.busy.x, init.busy.y, init.busy.align, init.busy.valign, - x, y); + x, y, + graphic_info[graphic].width, + graphic_info[graphic].height, + sync_frame, anim_initial.anim_delay); done = TRUE; } #endif - graphic_info = &anim_initial; /* graphic == 0 => anim_initial */ - if (sync_frame % anim_initial.anim_delay == 0) + { +#if 1 + Bitmap *src_bitmap; + int src_x, src_y; + int width = graphic_info[graphic].width; + int height = graphic_info[graphic].height; + int frame = getGraphicAnimationFrame(graphic, sync_frame); + + getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); + BlitBitmap(src_bitmap, window, src_x, src_y, width, height, x, y); +#else + /* !!! this can only draw TILEX/TILEY size animations !!! */ DrawGraphicAnimationExt(window, x, y, graphic, sync_frame, NO_MASKING); +#endif + } graphic_info = graphic_info_last; @@ -288,6 +333,7 @@ static int getFontBitmapID(int font_nr) { int special = -1; + /* (special case: do not use special font for GAME_MODE_LOADING) */ if (game_status >= GAME_MODE_TITLE_INITIAL && game_status <= GAME_MODE_PSEUDO_PREVIEW) special = game_status; @@ -306,12 +352,19 @@ static int getFontBitmapID(int font_nr) static int getFontFromToken(char *token) { +#if 1 + char *value = getHashEntry(font_token_hash, token); + + if (value != NULL) + return atoi(value); +#else int i; /* !!! OPTIMIZE THIS BY USING HASH !!! */ for (i = 0; i < NUM_FONTS; i++) if (strEqual(token, font_info[i].token_name)) return i; +#endif /* if font not found, use reliable default value */ return FONT_INITIAL_1; @@ -1132,15 +1185,31 @@ void InitElementSpecialGraphicInfo() static int get_graphic_parameter_value(char *value_raw, char *suffix, int type) { - int i; - int x = 0; - - if (type != TYPE_TOKEN) + if (type != TYPE_ELEMENT && type != TYPE_GRAPHIC) return get_parameter_value(value_raw, suffix, type); if (strEqual(value_raw, ARG_UNDEFINED)) return ARG_UNDEFINED_VALUE; +#if 1 + if (type == TYPE_ELEMENT) + { + char *value = getHashEntry(element_token_hash, value_raw); + + return (value != NULL ? atoi(value) : EL_UNDEFINED); + } + else if (type == TYPE_GRAPHIC) + { + char *value = getHashEntry(graphic_token_hash, value_raw); + + return (value != NULL ? atoi(value) : IMG_UNDEFINED); + } + +#else + + int i; + int x = 0; + /* !!! THIS IS BUGGY !!! NOT SURE IF YOU GET ELEMENT ID OR GRAPHIC ID !!! */ /* !!! (possible reason why ".clone_from" with elements doesn't work) !!! */ @@ -1164,6 +1233,7 @@ static int get_graphic_parameter_value(char *value_raw, char *suffix, int type) x++; } +#endif return -1; } @@ -1184,9 +1254,10 @@ static int get_scaled_graphic_height(int graphic) return original_height * scale_up_factor; } -static void set_graphic_parameters_ext(int graphic, struct GraphicInfo *g, - int *parameter, Bitmap *src_bitmap) +static void set_graphic_parameters_ext(int graphic, int *parameter, + Bitmap *src_bitmap) { + struct GraphicInfo *g = &graphic_info[graphic]; int anim_frames_per_row = 1, anim_frames_per_col = 1; int anim_frames_per_line = 1; @@ -1270,6 +1341,13 @@ static void set_graphic_parameters_ext(int graphic, struct GraphicInfo *g, int src_image_width = get_scaled_graphic_width(graphic); int src_image_height = get_scaled_graphic_height(graphic); + if (src_image_width == 0 || src_image_height == 0) + { + /* only happens when loaded outside artwork system (like "global.busy") */ + src_image_width = src_bitmap->width; + src_image_height = src_bitmap->height; + } + anim_frames_per_row = src_image_width / g->width; anim_frames_per_col = src_image_height / g->height; @@ -1432,8 +1510,7 @@ static void set_graphic_parameters(int graphic) image_config_suffix[i].token, image_config_suffix[i].type); - set_graphic_parameters_ext(graphic, &graphic_info[graphic], - parameter, src_bitmap); + set_graphic_parameters_ext(graphic, parameter, src_bitmap); #else @@ -2318,36 +2395,36 @@ static void InitMusicInfo() static void ReinitializeGraphics() { - print_init_timestamp("INIT ReinitializeGraphics"); + print_timestamp_init("ReinitializeGraphics"); InitGraphicInfo(); /* graphic properties mapping */ - print_init_timestamp("TIME InitGraphicInfo"); + print_timestamp_time("InitGraphicInfo"); InitElementGraphicInfo(); /* element game graphic mapping */ - print_init_timestamp("TIME InitElementGraphicInfo"); + print_timestamp_time("InitElementGraphicInfo"); InitElementSpecialGraphicInfo(); /* element special graphic mapping */ - print_init_timestamp("TIME InitElementSpecialGraphicInfo"); + print_timestamp_time("InitElementSpecialGraphicInfo"); InitElementSmallImages(); /* scale elements to all needed sizes */ - print_init_timestamp("TIME InitElementSmallImages"); + print_timestamp_time("InitElementSmallImages"); InitScaledImages(); /* scale all other images, if needed */ - print_init_timestamp("TIME InitScaledImages"); + print_timestamp_time("InitScaledImages"); InitFontGraphicInfo(); /* initialize text drawing functions */ - print_init_timestamp("TIME InitFontGraphicInfo"); + print_timestamp_time("InitFontGraphicInfo"); InitGraphicInfo_EM(); /* graphic mapping for EM engine */ - print_init_timestamp("TIME InitGraphicInfo_EM"); + print_timestamp_time("InitGraphicInfo_EM"); SetMainBackgroundImage(IMG_BACKGROUND); - print_init_timestamp("TIME SetMainBackgroundImage"); + print_timestamp_time("SetMainBackgroundImage"); SetDoorBackgroundImage(IMG_BACKGROUND_DOOR); - print_init_timestamp("TIME SetDoorBackgroundImage"); + print_timestamp_time("SetDoorBackgroundImage"); InitGadgets(); - print_init_timestamp("TIME InitGadgets"); + print_timestamp_time("InitGadgets"); InitToons(); - print_init_timestamp("TIME InitToons"); + print_timestamp_time("InitToons"); - print_init_timestamp("DONE ReinitializeGraphics"); + print_timestamp_done("ReinitializeGraphics"); } static void ReinitializeSounds() @@ -2552,6 +2629,8 @@ void ResolveGroupElement(int group_element) void InitElementPropertiesStatic() { + static boolean clipboard_elements_initialized = FALSE; + static int ep_diggable[] = { EL_SAND, @@ -4500,9 +4579,12 @@ void InitElementPropertiesStatic() int i, j, k; /* always start with reliable default values (element has no properties) */ + /* (but never initialize clipboard elements after the very first time) */ + /* (to be able to use clipboard elements between several levels) */ for (i = 0; i < MAX_NUM_ELEMENTS; i++) - for (j = 0; j < NUM_ELEMENT_PROPERTIES; j++) - SET_PROPERTY(i, j, FALSE); + if (!IS_CLIPBOARD_ELEMENT(i) || !clipboard_elements_initialized) + for (j = 0; j < NUM_ELEMENT_PROPERTIES; j++) + SET_PROPERTY(i, j, FALSE); /* set all base element properties from above array definitions */ for (i = 0; element_properties[i].elements != NULL; i++) @@ -4520,6 +4602,8 @@ void InitElementPropertiesStatic() /* set static element properties that are not listed in array definitions */ for (i = EL_STEEL_CHAR_START; i <= EL_STEEL_CHAR_END; i++) SET_PROPERTY(i, EP_INDESTRUCTIBLE, TRUE); + + clipboard_elements_initialized = TRUE; } void InitElementPropertiesEngine(int engine_version) @@ -4568,6 +4652,10 @@ void InitElementPropertiesEngine(int engine_version) /* set all special, combined or engine dependent element properties */ for (i = 0; i < MAX_NUM_ELEMENTS; i++) { + /* do not change (already initialized) clipboard elements here */ + if (IS_CLIPBOARD_ELEMENT(i)) + continue; + /* ---------- INACTIVE ------------------------------------------------- */ SET_PROPERTY(i, EP_INACTIVE, ((i >= EL_CHAR_START && i <= EL_CHAR_END) || @@ -4798,6 +4886,7 @@ void InitElementPropertiesAfterLoading(int engine_version) static void InitGlobal() { + int graphic; int i; for (i = 0; i < MAX_NUM_ELEMENTS + 1; i++) @@ -4815,6 +4904,37 @@ static void InitGlobal() #endif } + /* create hash from image config list */ + image_config_hash = newSetupFileHash(); + for (i = 0; image_config[i].token != NULL; i++) + setHashEntry(image_config_hash, + image_config[i].token, + image_config[i].value); + + /* create hash from element token list */ + element_token_hash = newSetupFileHash(); + for (i = 0; element_name_info[i].token_name != NULL; i++) + setHashEntry(element_token_hash, + element_name_info[i].token_name, + int2str(i, 0)); + + /* create hash from graphic token list */ + graphic_token_hash = newSetupFileHash(); + for (graphic = 0, i = 0; image_config[i].token != NULL; i++) + if (strSuffix(image_config[i].value, ".pcx") || + strSuffix(image_config[i].value, ".wav") || + strEqual(image_config[i].value, UNDEFINED_FILENAME)) + setHashEntry(graphic_token_hash, + image_config[i].token, + int2str(graphic++, 0)); + + /* create hash from font token list */ + font_token_hash = newSetupFileHash(); + for (i = 0; font_info[i].token_name != NULL; i++) + setHashEntry(font_token_hash, + font_info[i].token_name, + int2str(i, 0)); + /* always start with reliable default values (all elements) */ for (i = 0; i < MAX_NUM_ELEMENTS; i++) ActiveElement[i] = i; @@ -5264,11 +5384,13 @@ static void InitArtworkConfig() static void InitMixer() { OpenAudio(); + StartMixer(); } void InitGfx() { + struct GraphicInfo *graphic_info_last = graphic_info; char *filename_font_initial = NULL; char *filename_anim_initial = NULL; Bitmap *bitmap_font_initial = NULL; @@ -5317,6 +5439,7 @@ void InitGfx() bitmap_db_field = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH); bitmap_db_panel = CreateBitmap(DXSIZE, DYSIZE, DEFAULT_DEPTH); bitmap_db_door = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH); + bitmap_db_toons = CreateBitmap(FULL_SXSIZE, FULL_SYSIZE, DEFAULT_DEPTH); /* initialize screen properties */ InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE, @@ -5325,6 +5448,7 @@ void InitGfx() InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE); InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE); InitGfxScrollbufferInfo(FXSIZE, FYSIZE); + InitGfxCustomArtworkInfo(); bitmap_font_initial = LoadCustomImage(filename_font_initial); @@ -5400,13 +5524,38 @@ void InitGfx() } } - set_graphic_parameters_ext(0, &anim_initial, parameter, NULL); +#if defined(CREATE_SPECIAL_EDITION_RND_JUE) + filename_anim_initial = "loading.pcx"; + + parameter[GFX_ARG_X] = 0; + parameter[GFX_ARG_Y] = 0; + parameter[GFX_ARG_WIDTH] = 128; + parameter[GFX_ARG_HEIGHT] = 40; + parameter[GFX_ARG_FRAMES] = 32; + parameter[GFX_ARG_DELAY] = 4; + parameter[GFX_ARG_FRAMES_PER_LINE] = ARG_UNDEFINED_VALUE; +#endif if (filename_anim_initial == NULL) /* should not happen */ Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_GLOBAL_BUSY); anim_initial.bitmap = LoadCustomImage(filename_anim_initial); + graphic_info = &anim_initial; /* graphic == 0 => anim_initial */ + + set_graphic_parameters_ext(0, parameter, anim_initial.bitmap); + +#if 0 + printf("::: INIT_GFX: anim_frames_per_line == %d [%d / %d] [%d, %d]\n", + graphic_info[0].anim_frames_per_line, + get_scaled_graphic_width(0), + graphic_info[0].width, + getOriginalImageWidthFromImageID(0), + graphic_info[0].scale_up_factor); +#endif + + graphic_info = graphic_info_last; + init.busy.width = anim_initial.width; init.busy.height = anim_initial.height; @@ -5453,17 +5602,39 @@ static void InitLevelInfo() LoadLevelSetup_SeriesInfo(); /* last played level info */ } -void InitLevelArtworkInfo() +static void InitLevelArtworkInfo() { LoadLevelArtworkInfo(); } static void InitImages() { - print_init_timestamp("INIT InitImages"); + print_timestamp_init("InitImages"); + +#if 0 + printf("::: leveldir_current->identifier == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier); + printf("::: leveldir_current->graphics_path == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path); + printf("::: leveldir_current->graphics_set == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set); + printf("::: getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'\n", + leveldir_current == NULL ? "[NULL]" : LEVELDIR_ARTWORK_SET(leveldir_current, ARTWORK_TYPE_GRAPHICS)); +#endif setLevelArtworkDir(artwork.gfx_first); +#if 0 + printf("::: leveldir_current->identifier == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier); + printf("::: leveldir_current->graphics_path == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path); + printf("::: leveldir_current->graphics_set == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set); + printf("::: getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'\n", + leveldir_current == NULL ? "[NULL]" : LEVELDIR_ARTWORK_SET(leveldir_current, ARTWORK_TYPE_GRAPHICS)); +#endif + #if 0 printf("::: InitImages for '%s' ['%s', '%s'] ['%s', '%s']\n", leveldir_current->identifier, @@ -5476,31 +5647,31 @@ static void InitImages() UPDATE_BUSY_STATE(); ReloadCustomImages(); - print_init_timestamp("TIME ReloadCustomImages"); + print_timestamp_time("ReloadCustomImages"); UPDATE_BUSY_STATE(); LoadCustomElementDescriptions(); - print_init_timestamp("TIME LoadCustomElementDescriptions"); + print_timestamp_time("LoadCustomElementDescriptions"); UPDATE_BUSY_STATE(); LoadMenuDesignSettings(); - print_init_timestamp("TIME LoadMenuDesignSettings"); + print_timestamp_time("LoadMenuDesignSettings"); UPDATE_BUSY_STATE(); ReinitializeGraphics(); - print_init_timestamp("TIME ReinitializeGraphics"); + print_timestamp_time("ReinitializeGraphics"); UPDATE_BUSY_STATE(); - print_init_timestamp("DONE InitImages"); + print_timestamp_done("InitImages"); } static void InitSound(char *identifier) { - print_init_timestamp("INIT InitSound"); + print_timestamp_init("InitSound"); if (identifier == NULL) identifier = artwork.snd_current->identifier; @@ -5509,17 +5680,17 @@ static void InitSound(char *identifier) setLevelArtworkDir(artwork.snd_first); InitReloadCustomSounds(identifier); - print_init_timestamp("TIME InitReloadCustomSounds"); + print_timestamp_time("InitReloadCustomSounds"); ReinitializeSounds(); - print_init_timestamp("TIME ReinitializeSounds"); + print_timestamp_time("ReinitializeSounds"); - print_init_timestamp("DONE InitSound"); + print_timestamp_done("InitSound"); } static void InitMusic(char *identifier) { - print_init_timestamp("INIT InitMusic"); + print_timestamp_init("InitMusic"); if (identifier == NULL) identifier = artwork.mus_current->identifier; @@ -5528,12 +5699,12 @@ static void InitMusic(char *identifier) setLevelArtworkDir(artwork.mus_first); InitReloadCustomMusic(identifier); - print_init_timestamp("TIME InitReloadCustomMusic"); + print_timestamp_time("InitReloadCustomMusic"); ReinitializeMusic(); - print_init_timestamp("TIME ReinitializeMusic"); + print_timestamp_time("ReinitializeMusic"); - print_init_timestamp("DONE InitMusic"); + print_timestamp_done("InitMusic"); } void InitNetworkServer() @@ -5559,6 +5730,124 @@ void InitNetworkServer() #endif } +static boolean CheckArtworkConfigForCustomElements(char *filename) +{ + SetupFileHash *setup_file_hash; + boolean redefined_ce_found = FALSE; + + /* !!! CACHE THIS BY USING HASH 'filename' => 'true/false' !!! */ + + if ((setup_file_hash = loadSetupFileHash(filename)) != NULL) + { + BEGIN_HASH_ITERATION(setup_file_hash, itr) + { + char *token = HASH_ITERATION_TOKEN(itr); + + if (strPrefix(token, "custom_")) + { + redefined_ce_found = TRUE; + + break; + } + } + END_HASH_ITERATION(setup_file_hash, itr) + + freeSetupFileHash(setup_file_hash); + } + + return redefined_ce_found; +} + +static boolean CheckArtworkTypeForRedefinedCustomElements(int type) +{ + char *filename_base, *filename_local; + boolean redefined_ce_found = FALSE; + + setLevelArtworkDir(ARTWORK_FIRST_NODE(artwork, type)); + +#if 0 + printf("::: leveldir_current->identifier == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->identifier); + printf("::: leveldir_current->graphics_path == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_path); + printf("::: leveldir_current->graphics_set == '%s'\n", + leveldir_current == NULL ? "[NULL]" : leveldir_current->graphics_set); + printf("::: getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) == '%s'\n", + leveldir_current == NULL ? "[NULL]" : + LEVELDIR_ARTWORK_SET(leveldir_current, type)); +#endif + + /* first look for special artwork configured in level series config */ + filename_base = getCustomArtworkLevelConfigFilename(type); + +#if 0 + printf("::: filename_base == '%s'\n", filename_base); +#endif + + if (fileExists(filename_base)) + redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_base); + + filename_local = getCustomArtworkConfigFilename(type); + +#if 0 + printf("::: filename_local == '%s'\n", filename_local); +#endif + + if (filename_local != NULL && !strEqual(filename_base, filename_local)) + redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_local); + +#if 0 + printf("::: redefined_ce_found == %d\n", redefined_ce_found); +#endif + + return redefined_ce_found; +} + +static void InitOverrideArtwork() +{ + boolean redefined_ce_found = FALSE; + + /* to check if this level set redefines any CEs, do not use overriding */ + gfx.override_level_graphics = FALSE; + gfx.override_level_sounds = FALSE; + gfx.override_level_music = FALSE; + + /* now check if this level set has definitions for custom elements */ + if (setup.override_level_graphics == AUTO || + setup.override_level_sounds == AUTO || + setup.override_level_music == AUTO) + redefined_ce_found = + (CheckArtworkTypeForRedefinedCustomElements(ARTWORK_TYPE_GRAPHICS) | + CheckArtworkTypeForRedefinedCustomElements(ARTWORK_TYPE_SOUNDS) | + CheckArtworkTypeForRedefinedCustomElements(ARTWORK_TYPE_MUSIC)); + +#if 0 + printf("::: redefined_ce_found == %d\n", redefined_ce_found); +#endif + + if (redefined_ce_found) + { + /* this level set has CE definitions: change "AUTO" to "FALSE" */ + gfx.override_level_graphics = (setup.override_level_graphics == TRUE); + gfx.override_level_sounds = (setup.override_level_sounds == TRUE); + gfx.override_level_music = (setup.override_level_music == TRUE); + } + else + { + /* this level set has no CE definitions: change "AUTO" to "TRUE" */ + gfx.override_level_graphics = (setup.override_level_graphics != FALSE); + gfx.override_level_sounds = (setup.override_level_sounds != FALSE); + gfx.override_level_music = (setup.override_level_music != FALSE); + } + +#if 0 + printf("::: => %d, %d, %d\n", + gfx.override_level_graphics, + gfx.override_level_sounds, + gfx.override_level_music); +#endif +} + static char *getNewArtworkIdentifier(int type) { static char *leveldir_current_identifier[3] = { NULL, NULL, NULL }; @@ -5566,7 +5855,11 @@ static char *getNewArtworkIdentifier(int type) static boolean last_has_level_artwork_set[3] = { FALSE, FALSE, FALSE }; static boolean initialized[3] = { FALSE, FALSE, FALSE }; TreeInfo *artwork_first_node = ARTWORK_FIRST_NODE(artwork, type); +#if 1 + boolean setup_override_artwork = GFX_OVERRIDE_ARTWORK(type); +#else boolean setup_override_artwork = SETUP_OVERRIDE_ARTWORK(setup, type); +#endif char *setup_artwork_set = SETUP_ARTWORK_SET(setup, type); char *leveldir_identifier = leveldir_current->identifier; #if 1 @@ -5674,6 +5967,7 @@ static char *getNewArtworkIdentifier(int type) void ReloadCustomArtwork(int force_reload) { + int last_game_status = game_status; /* save current game status */ char *gfx_new_identifier; char *snd_new_identifier; char *mus_new_identifier; @@ -5682,6 +5976,8 @@ void ReloadCustomArtwork(int force_reload) boolean force_reload_mus = (force_reload & (1 << ARTWORK_TYPE_MUSIC)); boolean reload_needed; + InitOverrideArtwork(); + force_reload_gfx |= AdjustGraphicsForEMC(); gfx_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_GRAPHICS); @@ -5695,10 +5991,26 @@ void ReloadCustomArtwork(int force_reload) if (!reload_needed) return; - print_init_timestamp("INIT ReloadCustomArtwork"); + print_timestamp_init("ReloadCustomArtwork"); + + game_status = GAME_MODE_LOADING; + + FadeOut(REDRAW_ALL); +#if 1 + ClearRectangle(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); +#else ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); - print_init_timestamp("TIME ClearRectangle"); +#endif + print_timestamp_time("ClearRectangle"); + +#if 0 + printf("::: fading in ... %d\n", fading.fade_mode); +#endif + FadeIn(REDRAW_ALL); +#if 0 + printf("::: done\n"); +#endif if (gfx_new_identifier != NULL || force_reload_gfx) { @@ -5711,31 +6023,47 @@ void ReloadCustomArtwork(int force_reload) #endif InitImages(); - print_init_timestamp("TIME InitImages"); + print_timestamp_time("InitImages"); } if (snd_new_identifier != NULL || force_reload_snd) { InitSound(snd_new_identifier); - print_init_timestamp("TIME InitSound"); + print_timestamp_time("InitSound"); } if (mus_new_identifier != NULL || force_reload_mus) { InitMusic(mus_new_identifier); - print_init_timestamp("TIME InitMusic"); + print_timestamp_time("InitMusic"); } + game_status = last_game_status; /* restore current game status */ + +#if 0 + printf("::: ----------------DELAY 1 ...\n"); + Delay(3000); +#endif + +#if 0 + printf("::: FadeOut @ ReloadCustomArtwork ...\n"); +#endif + FadeOut(REDRAW_ALL); +#if 0 + printf("::: FadeOut @ ReloadCustomArtwork done\n"); +#endif + RedrawBackground(); /* force redraw of (open or closed) door graphics */ SetDoorState(DOOR_OPEN_ALL); CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY); +#if 1 #if 1 #if 1 FadeSetEnterScreen(); - // FadeSkipNextFadeOut(); + FadeSkipNextFadeOut(); // FadeSetDisabled(); #else FadeSkipNext(); @@ -5743,8 +6071,13 @@ void ReloadCustomArtwork(int force_reload) #else fading = fading_none; #endif +#endif + +#if 0 + redraw_mask = REDRAW_ALL; +#endif - print_init_timestamp("DONE ReloadCustomArtwork"); + print_timestamp_done("ReloadCustomArtwork"); } void KeyboardAutoRepeatOffUnlessAutoplay() @@ -5760,7 +6093,9 @@ void KeyboardAutoRepeatOffUnlessAutoplay() void OpenAll() { - print_init_timestamp("INIT OpenAll"); + print_timestamp_init("OpenAll"); + + game_status = GAME_MODE_LOADING; InitGlobal(); /* initialize some global variables */ @@ -5793,7 +6128,7 @@ void OpenAll() InitJoysticks(); - print_init_timestamp("TIME [pre-video]"); + print_timestamp_time("[pre-video]"); InitVideoDisplay(); InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); @@ -5803,26 +6138,29 @@ void OpenAll() InitElementPropertiesStatic(); InitElementPropertiesEngine(GAME_VERSION_ACTUAL); - print_init_timestamp("TIME [post-video]"); + print_timestamp_time("[post-video]"); InitGfx(); - print_init_timestamp("TIME InitGfx"); + print_timestamp_time("InitGfx"); InitLevelInfo(); - print_init_timestamp("TIME InitLevelInfo"); + print_timestamp_time("InitLevelInfo"); InitLevelArtworkInfo(); - print_init_timestamp("TIME InitLevelArtworkInfo"); + print_timestamp_time("InitLevelArtworkInfo"); + + InitOverrideArtwork(); /* needs to know current level directory */ + print_timestamp_time("InitOverrideArtwork"); InitImages(); /* needs to know current level directory */ - print_init_timestamp("TIME InitImages"); + print_timestamp_time("InitImages"); InitSound(NULL); /* needs to know current level directory */ - print_init_timestamp("TIME InitSound"); + print_timestamp_time("InitSound"); InitMusic(NULL); /* needs to know current level directory */ - print_init_timestamp("TIME InitMusic"); + print_timestamp_time("InitMusic"); InitGfxBackground(); @@ -5852,9 +6190,9 @@ void OpenAll() fading = fading_none; #endif - print_init_timestamp("TIME [post-artwork]"); + print_timestamp_time("[post-artwork]"); - print_init_timestamp("DONE OpenAll"); + print_timestamp_done("OpenAll"); DrawMainMenu();