X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=4f7ca41ab30ee78edf0f5ebf7f043af760b05bf3;hb=77ed16f5281022dce4854250c08ec288f37a99e8;hp=6d0b9501bb136d832991a1902ec20fd07ddc0e78;hpb=f965a2a6e56dd5c1e91b306dfd52b38b1dd49537;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 6d0b9501..4f7ca41a 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 10 +#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH 1 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS]; @@ -186,20 +186,8 @@ void DrawInitAnim() } #endif -#if 0 - anim_initial.anim_mode = ANIM_LOOP; - anim_initial.anim_start_frame = 0; - anim_initial.offset_x = anim_initial.width; - anim_initial.offset_y = 0; -#endif - -#if 1 - x = ALIGNED_TEXT_XPOS(&init.busy); - y = ALIGNED_TEXT_YPOS(&init.busy); -#else - x = WIN_XSIZE / 2 - TILESIZE / 2; - y = WIN_YSIZE / 2 - TILESIZE / 2; -#endif + x = ALIGNED_TEXT_XPOS(&init_last.busy); + y = ALIGNED_TEXT_YPOS(&init_last.busy); graphic_info = &anim_initial; /* graphic == 0 => anim_initial */ @@ -1513,6 +1501,12 @@ static void set_graphic_parameters_ext(int graphic, int *parameter, g->class = parameter[GFX_ARG_CLASS]; if (parameter[GFX_ARG_STYLE] != ARG_UNDEFINED_VALUE) g->style = parameter[GFX_ARG_STYLE]; + + /* this is only used for drawing menu buttons and text */ + g->active_xoffset = parameter[GFX_ARG_ACTIVE_XOFFSET]; + g->active_yoffset = parameter[GFX_ARG_ACTIVE_YOFFSET]; + g->pressed_xoffset = parameter[GFX_ARG_PRESSED_XOFFSET]; + g->pressed_yoffset = parameter[GFX_ARG_PRESSED_YOFFSET]; } static void set_graphic_parameters(int graphic) @@ -2043,6 +2037,60 @@ static void InitGraphicInfo() #endif } +static void InitGraphicCompatibilityInfo() +{ + struct FileInfo *fi_global_door = + getImageListEntryFromImageID(IMG_GLOBAL_DOOR); + int num_images = getImageListSize(); + int i; + + /* the following compatibility handling is needed for the following case: + versions up to 3.3.0.0 used one large bitmap "global.door" for various + graphics mainly used for door and panel graphics, like editor, tape and + in-game buttons with hard-coded bitmap positions and button sizes; as + these graphics now have individual definitions, redefining "global.door" + to change all these graphics at once like before does not work anymore + (because all those individual definitions still have their default values); + to solve this, remap all those individual definitions that are not + redefined to the new bitmap of "global.door" if it was redefined */ + + /* special compatibility handling if image "global.door" was redefined */ + if (fi_global_door->redefined) + { + for (i = 0; i < num_images; i++) + { + struct FileInfo *fi = getImageListEntryFromImageID(i); + + /* process only those images that still use the default settings */ + if (!fi->redefined) + { + /* process all images which default to same image as "global.door" */ + if (strEqual(fi->default_filename, fi_global_door->default_filename)) + { + // printf("::: special treatment needed for token '%s'\n", fi->token); + + graphic_info[i].bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; + } + } + } + } + +#if 0 + for (i = 0; i < num_images; i++) + { + struct FileInfo *fi = getImageListEntryFromImageID(i); + + if (i == IMG_GLOBAL_DOOR) + { + printf("::: %s, %s, %d\n", + fi->default_filename, + fi->filename, + fi->redefined); + } + } +#endif +} + static void InitElementSoundInfo() { struct PropertyMapping *property_mapping = getSoundListPropertyMapping(); @@ -2438,6 +2486,9 @@ static void ReinitializeGraphics() InitGraphicInfo_EM(); /* graphic mapping for EM engine */ print_timestamp_time("InitGraphicInfo_EM"); + InitGraphicCompatibilityInfo(); + print_timestamp_time("InitGraphicCompatibilityInfo"); + SetMainBackgroundImage(IMG_BACKGROUND); print_timestamp_time("SetMainBackgroundImage"); SetDoorBackgroundImage(IMG_BACKGROUND_DOOR); @@ -5461,6 +5512,28 @@ static void InitMixer() StartMixer(); } +void InitGfxBuffers() +{ + ReCreateBitmap(&bitmap_db_store, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); + ReCreateBitmap(&bitmap_db_cross, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); + ReCreateBitmap(&bitmap_db_field, FXSIZE, FYSIZE, DEFAULT_DEPTH); + ReCreateBitmap(&bitmap_db_panel, DXSIZE, DYSIZE, DEFAULT_DEPTH); + ReCreateBitmap(&bitmap_db_door, 3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH); + ReCreateBitmap(&bitmap_db_toons, FULL_SXSIZE, FULL_SYSIZE, DEFAULT_DEPTH); + + /* initialize screen properties */ + InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, + bitmap_db_field); + InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE); + InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE); + InitGfxWindowInfo(WIN_XSIZE, WIN_YSIZE); + InitGfxScrollbufferInfo(FXSIZE, FYSIZE); + InitGfxClipRegion(FALSE, -1, -1, -1, -1); + + InitGfxBuffers_SP(); +} + void InitGfx() { struct GraphicInfo *graphic_info_last = graphic_info; @@ -5507,7 +5580,11 @@ void InitGfx() if (filename_font_initial == NULL) /* should not happen */ Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_FONT_INITIAL); +#if 1 + InitGfxBuffers(); +#else /* create additional image buffers for double-buffering and cross-fading */ + bitmap_db_store = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); bitmap_db_cross = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); bitmap_db_field = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH); bitmap_db_panel = CreateBitmap(DXSIZE, DYSIZE, DEFAULT_DEPTH); @@ -5522,6 +5599,8 @@ void InitGfx() InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE); InitGfxWindowInfo(WIN_XSIZE, WIN_YSIZE); InitGfxScrollbufferInfo(FXSIZE, FYSIZE); +#endif + InitGfxCustomArtworkInfo(); bitmap_font_initial = LoadCustomImage(filename_font_initial); @@ -5635,6 +5714,9 @@ void InitGfx() InitMenuDesignSettings_Static(); InitGfxDrawBusyAnimFunction(DrawInitAnim); + + /* use copy of busy animation to prevent change while reloading artwork */ + init_last = init; #endif } @@ -6114,6 +6196,8 @@ void ReloadCustomArtwork(int force_reload) game_status = last_game_status; /* restore current game status */ + init_last = init; /* switch to new busy animation */ + #if 0 printf("::: ----------------DELAY 1 ...\n"); Delay(3000);