X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=42e502dcd94996ea0212e08d9c2bd7d77b4d6e7f;hb=c38b8938950533926b72af227c38513fe665a8f6;hp=22ac7a8f96a1bda62f307262f2740ceba090d4e4;hpb=08ad905f20de863e1f86eb772ecc2fbf7721529d;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 22ac7a8f..42e502dc 100644 --- a/src/init.c +++ b/src/init.c @@ -55,6 +55,8 @@ static char *image_filename[NUM_PICTURES] = #endif }; +static Bitmap *bitmap_font_initial = NULL; + static void InitSetup(void); static void InitPlayerInfo(void); static void InitLevelInfo(void); @@ -113,12 +115,14 @@ void OpenAll(void) InitEventFilter(FilterMouseMotionEvents); - InitGfx(); InitElementProperties(); /* initializes IS_CHAR() for el2gfx() */ InitElementInfo(); + InitGfx(); + InitLevelInfo(); InitLevelArtworkInfo(); + InitImages(); /* needs to know current level directory */ InitSound(); /* needs to know current level directory */ InitGadgets(); /* needs images + number of level series */ @@ -189,14 +193,24 @@ void InitNetworkServer() #endif } +static void ReinitializeGraphics() +{ + ReloadCustomImages(); /* load custom image files */ + + InitGraphicInfo(); /* initialize graphic info from config file */ + + InitFontInfo(bitmap_font_initial, + new_graphic_info[IMG_MENU_FONT_BIG].bitmap, + new_graphic_info[IMG_MENU_FONT_MEDIUM].bitmap, + new_graphic_info[IMG_MENU_FONT_SMALL].bitmap, + new_graphic_info[IMG_MENU_FONT_EM].bitmap); +} + static void InitImages() { InitImageList(image_config, image_config_suffix, NUM_IMAGE_FILES); - /* load custom images */ - ReloadCustomImages(); - - InitGraphicInfo(); + ReinitializeGraphics(); } static void InitMixer() @@ -301,6 +315,7 @@ static void InitTileClipmasks() tile_clip_gc = XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values); +#if 0 for (i=0; iclip_mask) @@ -312,6 +327,7 @@ static void InitTileClipmasks() clip_gc_valuemask, &clip_gc_values); } } +#endif #if defined(TARGET_X11_NATIVE) @@ -371,6 +387,7 @@ void FreeTileClipmasks() XFreeGC(display, tile_clip_gc); tile_clip_gc = None; +#if 0 for (i=0; istored_clip_gc) @@ -379,12 +396,16 @@ void FreeTileClipmasks() pix[i]->stored_clip_gc = None; } } +#endif + #endif /* TARGET_X11 */ } void InitGfx() { +#if 0 int i; +#endif /* initialize some global variables */ global.frames_per_second = 0; @@ -399,30 +420,42 @@ void InitGfx() InitGfxScrollbufferInfo(FXSIZE, FYSIZE); /* create additional image buffers for double-buffering */ - pix[PIX_DB_DOOR] = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH); - pix[PIX_DB_FIELD] = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH); + bitmap_db_field = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH); + bitmap_db_door = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH); +#if 0 pix[PIX_FONT_SMALL] = LoadCustomImage(image_filename[PIX_FONT_SMALL]); InitFontInfo(NULL, NULL, pix[PIX_FONT_SMALL], NULL); +#else + bitmap_font_initial = LoadCustomImage(image_filename[PIX_FONT_SMALL]); + + InitFontInfo(bitmap_font_initial, NULL, NULL, NULL, NULL); +#endif DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW); DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED); DrawInitText("Loading graphics:", 120, FC_GREEN); +#if 0 for (i=0; iidentifier; char *snd_new_identifier = artwork.snd_current->identifier; char *mus_new_identifier = artwork.mus_current->identifier; + boolean redraw_screen = FALSE; + + if (leveldir_current_identifier == NULL) + leveldir_current_identifier = leveldir_current->identifier; + +#if 0 + printf("CURRENT GFX: '%s' ['%s']\n", artwork.gfx_current->identifier, + leveldir_current->graphics_set); + printf("CURRENT LEV: '%s' / '%s'\n", leveldir_current_identifier, + leveldir_current->identifier); +#endif #if 0 printf("graphics --> '%s' ('%s')\n", @@ -508,31 +552,48 @@ void ReloadCustomArtwork() if (strcmp(artwork.gfx_current_identifier, gfx_new_identifier) != 0 || last_override_level_graphics != setup.override_level_graphics) { +#if 0 + printf("CHANGED GFX: '%s' -> '%s'\n", + artwork.gfx_current_identifier, gfx_new_identifier); +#endif + +#if 0 int i; +#endif setLevelArtworkDir(artwork.gfx_first); ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); +#if 0 for (i=0; iidentifier; +#endif last_override_level_graphics = setup.override_level_graphics; + + redraw_screen = TRUE; } if (strcmp(artwork.snd_current_identifier, snd_new_identifier) != 0 || @@ -545,6 +606,8 @@ void ReloadCustomArtwork() artwork.snd_current_identifier = snd_new_identifier; last_override_level_sounds = setup.override_level_sounds; + + redraw_screen = TRUE; } if (strcmp(artwork.mus_current_identifier, mus_new_identifier) != 0 || @@ -557,6 +620,17 @@ void ReloadCustomArtwork() artwork.mus_current_identifier = mus_new_identifier; last_override_level_music = setup.override_level_music; + + redraw_screen = TRUE; + } + + if (redraw_screen) + { + InitGfxBackground(); + + /* force redraw of (open or closed) door graphics */ + SetDoorState(DOOR_OPEN_ALL); + CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY); } #if 0 @@ -1079,6 +1153,9 @@ void InitElementInfo() static void InitGraphicInfo() { static int gfx_action[NUM_IMAGE_FILES]; + Bitmap *src_bitmap; + int src_x, src_y; + int last_frame; int i; image_files = getCurrentImageList(); @@ -1189,8 +1266,43 @@ static void InitGraphicInfo() /* animation synchronized with global frame counter, not move position */ new_graphic_info[i].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC]; #endif + + /* now check if the loaded image is large enough for the animation */ + last_frame = new_graphic_info[i].anim_frames - 1; + + getGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y); + if (src_x + TILEX > src_bitmap->width || + src_y + TILEY > src_bitmap->height) + Error(ERR_EXIT, "InitGraphicInfo: image bitmap '%s' too small for graphic object %d (normal size)", src_bitmap->source_filename, i); + + getMiniGraphicSource(i, &src_bitmap, &src_x, &src_y); + if (src_x + MINI_TILEX > src_bitmap->width || + src_y + MINI_TILEY > src_bitmap->height) + Error(ERR_EXIT, "InitGraphicInfo: image bitmap '%s' too small for graphic object %d ('mini' size)", src_bitmap->source_filename, i); + + getMicroGraphicSource(i, &src_bitmap, &src_x, &src_y); + if (src_x + MICRO_TILEX > src_bitmap->width || + src_y + MICRO_TILEY > src_bitmap->height) + Error(ERR_EXIT, "InitGraphicInfo: image bitmap '%s' too small for graphic object %d ('micro' size)", src_bitmap->source_filename, i); + + +#if 0 + { + int j; + + if (i == IMG_EMERALD) + { + for (j=0; j %d\n", image_config_suffix[j].token, parameter[j]); + printf("-> %d\n", new_graphic_info[i].anim_frames); + printf("\n"); + } + } +#endif + } + #if 0 printf("D> %d\n", image_files[GFX_BD_DIAMOND].parameter[GFX_ARG_NUM_FRAMES]); printf("W> %d\n", image_files[GFX_ROBOT_WHEEL].parameter[GFX_ARG_NUM_FRAMES]); @@ -2490,7 +2602,9 @@ void Execute_Debug_Command(char *command) void CloseAllAndExit(int exit_value) { +#if 0 int i; +#endif StopSounds(); FreeAllSounds(); @@ -2500,8 +2614,13 @@ void CloseAllAndExit(int exit_value) FreeAllImages(); FreeTileClipmasks(); +#if 0 for (i=0; i