X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Finit.c;h=e8bf10b6882b507396039e60f8e966998f9b457c;hp=9b487df0ee4a7579bdf3a588df0a0f73d83bbbe3;hb=c0c5862d9ee59c70412b1c35e558101b109a8ec9;hpb=479bba3c31872d0bf11756a6380988bf787ce5ef diff --git a/src/init.c b/src/init.c index 9b487df0..e8bf10b6 100644 --- a/src/init.c +++ b/src/init.c @@ -143,6 +143,15 @@ void InitElementSmallImages() InitElementSmallImagesScaledUp(special_graphics[i]); } +void InitScaledImages() +{ + int i; + + /* scale normal images from static configuration, if not already scaled */ + for (i = 0; i < NUM_IMAGE_FILES; i++) + ScaleImage(i, graphic_info[i].scale_up_factor); +} + #if 1 /* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */ void SetBitmaps_EM(Bitmap **em_bitmap) @@ -286,7 +295,7 @@ void InitFontGraphicInfo() if (graphic_info[graphic].anim_frames < MIN_NUM_CHARS_PER_FONT) { graphic_info[graphic].anim_frames = DEFAULT_NUM_CHARS_PER_FONT; - graphic_info[graphic].anim_frames_per_line= DEFAULT_NUM_CHARS_PER_LINE; + graphic_info[graphic].anim_frames_per_line = DEFAULT_NUM_CHARS_PER_LINE; } /* copy font relevant information from graphics information */ @@ -1009,6 +1018,9 @@ static void set_graphic_parameters(int graphic) else graphic_info[graphic].anim_frames = 1; + if (graphic_info[graphic].anim_frames == 0) /* frames must be at least 1 */ + graphic_info[graphic].anim_frames = 1; + graphic_info[graphic].anim_frames_per_line = (parameter[GFX_ARG_FRAMES_PER_LINE] != ARG_UNDEFINED_VALUE ? parameter[GFX_ARG_FRAMES_PER_LINE] : anim_frames_per_line); @@ -1647,7 +1659,8 @@ static void ReinitializeGraphics() InitElementGraphicInfo(); /* element game graphic mapping */ InitElementSpecialGraphicInfo(); /* element special graphic mapping */ - InitElementSmallImages(); /* scale images to all needed sizes */ + InitElementSmallImages(); /* scale elements to all needed sizes */ + InitScaledImages(); /* scale all other images, if needed */ InitFontGraphicInfo(); /* initialize text drawing functions */ InitGraphicInfo_EM(); /* graphic mapping for EM engine */ @@ -2894,6 +2907,7 @@ void InitElementPropertiesStatic() EL_EXPANDABLE_WALL_VERTICAL, EL_EXPANDABLE_WALL_ANY, EL_EXPANDABLE_WALL_GROWING, + EL_BD_EXPANDABLE_WALL, EL_BD_WALL, EL_SP_CHIP_SINGLE, EL_SP_CHIP_LEFT, @@ -2943,6 +2957,7 @@ void InitElementPropertiesStatic() EL_EXPANDABLE_WALL_HORIZONTAL, EL_EXPANDABLE_WALL_VERTICAL, EL_EXPANDABLE_WALL_ANY, + EL_BD_EXPANDABLE_WALL, EL_BD_WALL, EL_WALL_SLIPPERY, EL_EXIT_CLOSED, @@ -3522,8 +3537,8 @@ void InitElementPropertiesStatic() EL_INTERNAL_CASCADE_CHARS_ACTIVE, EL_INTERNAL_CASCADE_CE_ACTIVE, EL_INTERNAL_CASCADE_GE_ACTIVE, + EL_INTERNAL_CASCADE_REF_ACTIVE, EL_INTERNAL_CASCADE_USER_ACTIVE, - EL_INTERNAL_CASCADE_GENERIC_ACTIVE, EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE, -1 @@ -3542,13 +3557,26 @@ void InitElementPropertiesStatic() EL_INTERNAL_CASCADE_CHARS, EL_INTERNAL_CASCADE_CE, EL_INTERNAL_CASCADE_GE, + EL_INTERNAL_CASCADE_REF, EL_INTERNAL_CASCADE_USER, - EL_INTERNAL_CASCADE_GENERIC, EL_INTERNAL_CASCADE_DYNAMIC, -1 }; + static int ep_obsolete[] = + { + EL_PLAYER_OBSOLETE, + EL_KEY_OBSOLETE, + EL_EM_KEY_1_FILE_OBSOLETE, + EL_EM_KEY_2_FILE_OBSOLETE, + EL_EM_KEY_3_FILE_OBSOLETE, + EL_EM_KEY_4_FILE_OBSOLETE, + EL_ENVELOPE_OBSOLETE, + + -1 + }; + static struct { int *elements; @@ -3619,6 +3647,8 @@ void InitElementPropertiesStatic() { ep_editor_cascade_active, EP_EDITOR_CASCADE_ACTIVE }, { ep_editor_cascade_inactive, EP_EDITOR_CASCADE_INACTIVE }, + { ep_obsolete, EP_OBSOLETE }, + { NULL, -1 } }; @@ -3894,6 +3924,7 @@ void InitElementPropertiesEngine(int engine_version) engine_version > VERSION_IDENT(2,0,1,0))); } +#if 0 /* set default push delay values (corrected since version 3.0.7-1) */ if (engine_version < VERSION_IDENT(3,0,7,1)) { @@ -3905,7 +3936,9 @@ void InitElementPropertiesEngine(int engine_version) game.default_push_delay_fixed = 8; game.default_push_delay_random = 8; } +#endif +#if 0 /* set uninitialized push delay values of custom elements in older levels */ for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) { @@ -3916,7 +3949,9 @@ void InitElementPropertiesEngine(int engine_version) if (element_info[element].push_delay_random == -1) element_info[element].push_delay_random = game.default_push_delay_random; } +#endif +#if 0 /* set some other uninitialized values of custom elements in older levels */ if (engine_version < VERSION_IDENT(3,1,0,0)) { @@ -3930,6 +3965,7 @@ void InitElementPropertiesEngine(int engine_version) element_info[element].ignition_delay = 8; } } +#endif #if 0 /* set element properties that were handled incorrectly in older levels */ @@ -3945,6 +3981,54 @@ void InitElementPropertiesEngine(int engine_version) InitElementGraphicInfo(); } +void InitElementPropertiesAfterLoading(int engine_version) +{ + int i; + +#if 0 + /* set default push delay values (corrected since version 3.0.7-1) */ + if (engine_version < VERSION_IDENT(3,0,7,1)) + { + game.default_push_delay_fixed = 2; + game.default_push_delay_random = 8; + } + else + { + game.default_push_delay_fixed = 8; + game.default_push_delay_random = 8; + } +#endif + +#if 0 + /* set uninitialized push delay values of custom elements in older levels */ + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + + if (element_info[element].push_delay_fixed == -1) + element_info[element].push_delay_fixed = game.default_push_delay_fixed; + if (element_info[element].push_delay_random == -1) + element_info[element].push_delay_random = game.default_push_delay_random; + } +#endif + +#if 1 + /* set some other uninitialized values of custom elements in older levels */ + if (engine_version < VERSION_IDENT(3,1,0,0)) + { + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + + element_info[element].access_direction = MV_ALL_DIRECTIONS; + + element_info[element].explosion_delay = 17; + element_info[element].ignition_delay = 8; + } + } +#endif +} + static void InitGlobal() { int i; @@ -4137,6 +4221,45 @@ void Execute_Command(char *command) global.convert_level_nr = atoi(str_ptr); /* get level_nr value */ } } + +#if DEBUG +#if defined(TARGET_SDL) + else if (strEqual(command, "SDL_ListModes")) + { + SDL_Rect **modes; + int i; + + SDL_Init(SDL_INIT_VIDEO); + + /* get available fullscreen/hardware modes */ + modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE); + + /* check if there are any modes available */ + if (modes == NULL) + { + printf("No modes available!\n"); + + exit(-1); + } + + /* check if our resolution is restricted */ + if (modes == (SDL_Rect **)-1) + { + printf("All resolutions available.\n"); + } + else + { + printf("Available Modes:\n"); + + for(i = 0; modes[i]; i++) + printf(" %d x %d\n", modes[i]->w, modes[i]->h); + } + + exit(0); + } +#endif +#endif + else { Error(ERR_EXIT_HELP, "unrecognized command '%s'", command); @@ -4332,6 +4455,7 @@ void InitGfx() { char *filename_font_initial = NULL; Bitmap *bitmap_font_initial = NULL; + int font_height; int i, j; /* determine settings for initial font (for displaying startup messages) */ @@ -4371,8 +4495,10 @@ void InitGfx() if (filename_font_initial == NULL) /* should not happen */ Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_FONT_INITIAL); - /* create additional image buffers for double-buffering */ + /* create additional image buffers for double-buffering and cross-fading */ + 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); bitmap_db_door = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH); /* initialize screen properties */ @@ -4390,12 +4516,23 @@ void InitGfx() InitFontGraphicInfo(); + font_height = getFontHeight(FC_RED); + DrawInitText(getProgramInitString(), 20, FC_YELLOW); DrawInitText(PROGRAM_COPYRIGHT_STRING, 50, FC_RED); + DrawInitText(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height, FC_RED); DrawInitText("Loading graphics:", 120, FC_GREEN); } +void RedrawBackground() +{ + BlitBitmap(graphic_info[IMG_GLOBAL_BORDER].bitmap, backbuffer, + 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + + redraw_mask = REDRAW_ALL; +} + void InitGfxBackground() { int x, y; @@ -4404,8 +4541,8 @@ void InitGfxBackground() fieldbuffer = bitmap_db_field; SetDrawtoField(DRAW_BACKBUFFER); - BlitBitmap(graphic_info[IMG_GLOBAL_BORDER].bitmap, backbuffer, - 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + RedrawBackground(); + ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); ClearRectangle(bitmap_db_door, 0, 0, 3 * DXSIZE, DYSIZE + VYSIZE); @@ -4662,7 +4799,11 @@ void ReloadCustomArtwork(int force_reload) if (redraw_screen) { +#if 1 + RedrawBackground(); +#else InitGfxBackground(); +#endif /* force redraw of (open or closed) door graphics */ SetDoorState(DOOR_OPEN_ALL); @@ -4751,7 +4892,11 @@ void OpenAll() em_open_all(); #endif +#if 0 + DrawMainMenuExt(REDRAW_ALL); +#else DrawMainMenu(); +#endif InitNetworkServer(); } @@ -4777,5 +4922,8 @@ void CloseAllAndExit(int exit_value) CloseVideoDisplay(); ClosePlatformDependentStuff(); + if (exit_value != 0) + NotifyUserAboutErrorFile(); + exit(exit_value); }