X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=0d7dfe9359ded8e89ef18cc74ac6d7584785af8e;hb=2d769736ea3634a55a88c1d792ffdbefb190d1f3;hp=5d1867a2a1af1f37e1174e091fbaa706ae7ba82e;hpb=ae9c6c4794c6a8f9704850427de3ebbe933400da;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 5d1867a2..0d7dfe93 100644 --- a/src/init.c +++ b/src/init.c @@ -201,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; @@ -312,6 +329,14 @@ void SetBitmaps_EM(Bitmap **em_bitmap) } #endif +#if 1 +/* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */ +void SetBitmaps_SP(Bitmap **sp_bitmap) +{ + *sp_bitmap = graphic_info[IMG_SP_OBJECTS].bitmap; +} +#endif + static int getFontBitmapID(int font_nr) { int special = -1; @@ -327,6 +352,15 @@ static int getFontBitmapID(int font_nr) special = GFX_SPECIAL_ARG_DOOR; #endif +#if 0 + if (special != -1) + { + printf("%s%s\n", + font_info[font_nr].token_name, + special_suffix_info[special].suffix); + } +#endif + if (special != -1) return font_info[font_nr].special_bitmap_id[special]; else @@ -1237,9 +1271,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; @@ -1323,6 +1358,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; @@ -1485,8 +1527,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 @@ -2796,8 +2837,12 @@ void InitElementPropertiesStatic() EL_SIGN_FRANKIE, EL_STEEL_EXIT_CLOSED, EL_STEEL_EXIT_OPEN, + EL_STEEL_EXIT_OPENING, + EL_STEEL_EXIT_CLOSING, EL_EM_STEEL_EXIT_CLOSED, EL_EM_STEEL_EXIT_OPEN, + EL_EM_STEEL_EXIT_OPENING, + EL_EM_STEEL_EXIT_CLOSING, EL_DC_STEELWALL_1_LEFT, EL_DC_STEELWALL_1_RIGHT, EL_DC_STEELWALL_1_TOP, @@ -3120,10 +3165,16 @@ void InitElementPropertiesStatic() EL_SOKOBAN_FIELD_EMPTY, EL_EXIT_OPEN, EL_EM_EXIT_OPEN, +#if 1 + EL_EM_EXIT_OPENING, +#endif EL_SP_EXIT_OPEN, EL_SP_EXIT_OPENING, EL_STEEL_EXIT_OPEN, EL_EM_STEEL_EXIT_OPEN, +#if 1 + EL_EM_STEEL_EXIT_OPENING, +#endif EL_GATE_1, EL_GATE_2, EL_GATE_3, @@ -4135,6 +4186,7 @@ void InitElementPropertiesStatic() EL_PLAYER_2, EL_PLAYER_3, EL_PLAYER_4, + EL_SOKOBAN_FIELD_PLAYER, EL_SP_MURPHY, EL_YAMYAM, EL_YAMYAM_LEFT, @@ -4825,6 +4877,14 @@ void InitElementPropertiesEngine(int engine_version) -1 }; + static int ep_em_explodes_by_fire[] = + { + EL_EM_DYNAMITE, + EL_EM_DYNAMITE_ACTIVE, + EL_MOLE, + -1 + }; + /* special EM style gems behaviour */ for (i = 0; ep_em_slippery_wall[i] != -1; i++) SET_PROPERTY(ep_em_slippery_wall[i], EP_EM_SLIPPERY_WALL, @@ -4834,6 +4894,11 @@ void InitElementPropertiesEngine(int engine_version) SET_PROPERTY(EL_EXPANDABLE_WALL_GROWING, EP_EM_SLIPPERY_WALL, (level.em_slippery_gems && engine_version > VERSION_IDENT(2,0,1,0))); + + /* special EM style explosion behaviour regarding chain reactions */ + for (i = 0; ep_em_explodes_by_fire[i] != -1; i++) + SET_PROPERTY(ep_em_explodes_by_fire[i], EP_EXPLODES_BY_FIRE, + level.em_explodes_by_fire); } /* this is needed because some graphics depend on element properties */ @@ -4860,6 +4925,18 @@ void InitElementPropertiesAfterLoading(int engine_version) } } +void InitElementPropertiesGfxElement() +{ + int i; + + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + { + struct ElementInfo *ei = &element_info[i]; + + ei->gfx_element = (ei->use_gfx_element ? ei->gfx_element_initial : i); + } +} + static void InitGlobal() { int graphic; @@ -4952,6 +5029,7 @@ static void InitGlobal() global.autoplay_leveldir = NULL; global.convert_leveldir = NULL; + global.create_images_dir = NULL; global.frames_per_second = 0; global.fps_slowdown = FALSE; @@ -5059,7 +5137,7 @@ void Execute_Command(char *command) exit(0); } - else if (strncmp(command, "dump level ", 11) == 0) + else if (strPrefix(command, "dump level ")) { char *filename = &command[11]; @@ -5071,7 +5149,7 @@ void Execute_Command(char *command) exit(0); } - else if (strncmp(command, "dump tape ", 10) == 0) + else if (strPrefix(command, "dump tape ")) { char *filename = &command[10]; @@ -5083,7 +5161,7 @@ void Execute_Command(char *command) exit(0); } - else if (strncmp(command, "autoplay ", 9) == 0) + else if (strPrefix(command, "autoplay ")) { char *str_ptr = getStringCopy(&command[9]); /* read command parameters */ @@ -5119,9 +5197,9 @@ void Execute_Command(char *command) str_ptr++; } } - else if (strncmp(command, "convert ", 8) == 0) + else if (strPrefix(command, "convert ")) { - char *str_copy = getStringCopy(&command[8]); + char *str_copy = getStringCopy(strchr(command, ' ') + 1); char *str_ptr = strchr(str_copy, ' '); global.convert_leveldir = str_copy; @@ -5133,6 +5211,18 @@ void Execute_Command(char *command) global.convert_level_nr = atoi(str_ptr); /* get level_nr value */ } } + else if (strPrefix(command, "create images ")) + { +#if defined(TARGET_SDL) + global.create_images_dir = getStringCopy(&command[14]); + + if (access(global.create_images_dir, W_OK) != 0) + Error(ERR_EXIT, "image target directory '%s' not found or not writable", + global.create_images_dir); +#else + Error(ERR_EXIT, "command only available for SDL target"); +#endif + } #if DEBUG #if defined(TARGET_SDL) @@ -5360,11 +5450,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; @@ -5421,6 +5513,7 @@ void InitGfx() bitmap_db_field); InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE); InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE); + InitGfxWindowInfo(WIN_XSIZE, WIN_YSIZE); InitGfxScrollbufferInfo(FXSIZE, FYSIZE); InitGfxCustomArtworkInfo(); @@ -5498,13 +5591,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; @@ -5551,7 +5669,7 @@ static void InitLevelInfo() LoadLevelSetup_SeriesInfo(); /* last played level info */ } -void InitLevelArtworkInfo() +static void InitLevelArtworkInfo() { LoadLevelArtworkInfo(); } @@ -5560,8 +5678,30 @@ static void 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, @@ -5662,6 +5802,8 @@ 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) @@ -5683,50 +5825,94 @@ static boolean CheckArtworkConfigForCustomElements(char *filename) return redefined_ce_found; } -static void InitOverrideArtwork() +static boolean CheckArtworkTypeForRedefinedCustomElements(int type) { - boolean init_override_from_setup = TRUE; + char *filename_base, *filename_local; + boolean redefined_ce_found = FALSE; - gfx.override_level_graphics = FALSE; - gfx.override_level_sounds = FALSE; - gfx.override_level_music = FALSE; + setLevelArtworkDir(ARTWORK_FIRST_NODE(artwork, type)); - if (setup.auto_override_artwork) - { - char *filename_base, *filename_local; - boolean redefined_ce_found = FALSE; +#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(ARTWORK_TYPE_GRAPHICS); + /* first look for special artwork configured in level series config */ + filename_base = getCustomArtworkLevelConfigFilename(type); - if (fileExists(filename_base)) - redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_base); +#if 0 + printf("::: filename_base == '%s'\n", filename_base); +#endif - filename_local = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS); + if (fileExists(filename_base)) + redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_base); - if (filename_local != NULL && !strEqual(filename_base, filename_local)) - redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_local); + filename_local = getCustomArtworkConfigFilename(type); #if 0 - printf("::: redefined_ce_found == %d\n", redefined_ce_found); + printf("::: filename_local == '%s'\n", filename_local); #endif - if (!redefined_ce_found) - { - gfx.override_level_graphics = TRUE; - gfx.override_level_sounds = TRUE; - gfx.override_level_music = TRUE; + if (filename_local != NULL && !strEqual(filename_base, filename_local)) + redefined_ce_found |= CheckArtworkConfigForCustomElements(filename_local); - init_override_from_setup = FALSE; - } - } +#if 0 + printf("::: redefined_ce_found == %d\n", redefined_ce_found); +#endif + + return redefined_ce_found; +} + +static void InitOverrideArtwork() +{ + boolean redefined_ce_found = FALSE; - if (init_override_from_setup) + /* 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) { - gfx.override_level_graphics = setup.override_level_graphics; - gfx.override_level_sounds = setup.override_level_sounds; - gfx.override_level_music = setup.override_level_music; + /* 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) @@ -6018,6 +6204,7 @@ void OpenAll() InitElementPropertiesStatic(); InitElementPropertiesEngine(GAME_VERSION_ACTUAL); + InitElementPropertiesGfxElement(); print_timestamp_time("[post-video]"); @@ -6031,6 +6218,9 @@ void OpenAll() InitLevelArtworkInfo(); print_timestamp_time("InitLevelArtworkInfo"); + InitOverrideArtwork(); /* needs to know current level directory */ + print_timestamp_time("InitOverrideArtwork"); + InitImages(); /* needs to know current level directory */ print_timestamp_time("InitImages"); @@ -6046,6 +6236,10 @@ void OpenAll() em_open_all(); #endif +#if 1 + sp_open_all(); +#endif + if (global.autoplay_leveldir) { AutoPlayTape(); @@ -6056,6 +6250,11 @@ void OpenAll() ConvertLevels(); return; } + else if (global.create_images_dir) + { + CreateLevelSketchImages(); + return; + } game_status = GAME_MODE_MAIN; @@ -6088,6 +6287,10 @@ void CloseAllAndExit(int exit_value) em_close_all(); #endif +#if 1 + sp_close_all(); +#endif + FreeAllImages(); #if defined(TARGET_SDL)