X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=3d3a02cc286c95d245c24b7217de926c1c46fdd4;hb=29fc833ae1b5e46a429a9fa82098e8ad94f6f400;hp=3dcfe04e8358b4370643f3f1e22450fcd571cab9;hpb=91d08fad2fcec7e2b5931b4f336a89d14af313dd;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 3dcfe04e..3d3a02cc 100644 --- a/src/init.c +++ b/src/init.c @@ -30,32 +30,6 @@ #include "conf_esg.c" /* include auto-generated data structure definitions */ -static char *image_filename[NUM_PICTURES] = -{ -#if 0 - "RocksScreen.pcx", - "RocksDoor.pcx", - "RocksToons.pcx", - "RocksFontBig.pcx", - "RocksFontSmall.pcx", - "RocksFontMedium.pcx", - "RocksFontEM.pcx" -#else - "RocksScreen.pcx", - "RocksElements.pcx", - "RocksDoor.pcx", - "RocksHeroes.pcx", - "RocksToons.pcx", - "RocksSP.pcx", - "RocksDC.pcx", - "RocksMore.pcx", - "RocksFontBig.pcx", - "RocksFontSmall.pcx", - "RocksFontMedium.pcx", - "RocksFontEM.pcx" -#endif -}; - static Bitmap *bitmap_font_initial = NULL; static void InitGlobal(); @@ -73,9 +47,9 @@ static void InitMusic(); static void InitGfx(); static void InitGfxBackground(); static void InitGadgets(); -static void InitElementImages(); +static void InitElementSmallImages(); static void InitElementGraphicInfo(); -static void InitElementEditorGraphicInfo(); +static void InitElementSpecialGraphicInfo(); static void InitElementSoundInfo(); static void InitElementProperties(); static void InitGraphicInfo(); @@ -193,6 +167,14 @@ static void InitArtworkConfig() static char *direction_suffix[NUM_DIRECTIONS + 1]; static char *special_suffix[NUM_SPECIAL_GFX_ARGS + 1]; static char *dummy[1] = { NULL }; + static char *ignore_image_tokens[] = + { + "name", + "sort_priority", + "menu.main.hide_static_text", + "global.num_toons", + NULL + }; int i; for (i=0; i game graphic mapping */ - InitElementEditorGraphicInfo(); /* element => editor graphic mapping */ - InitGraphicInfo(); /* graphic => properties mapping */ + InitElementGraphicInfo(); /* element game graphic mapping */ + InitElementSpecialGraphicInfo(); /* element special graphic mapping */ + InitGraphicInfo(); /* graphic properties mapping */ + + InitElementSmallImages(); /* create editor and preview images */ InitFontInfo(bitmap_font_initial, graphic_info[IMG_FONT_BIG].bitmap, @@ -263,41 +248,12 @@ static void ReinitializeGraphics() InitGadgets(); InitToons(); - - - - /* !!! TEST ONLY !!! */ - if (0) - { - Bitmap *tst_bitmap = graphic_info[IMG_SAND].bitmap; - Bitmap *tmp_bitmap = ZoomBitmap(tst_bitmap, - tst_bitmap->width / 2, - tst_bitmap->height / 2); - - BlitBitmap(tmp_bitmap, tst_bitmap, 0, 0, 256, 224, 0, 448); - - FreeBitmap(tmp_bitmap); - } - - if (1) - { - printf("CREATING SMALL IMAGES...\n"); - -#if 1 - InitElementImages(); -#else - CreateImageWithSmallImages(IMG_SAND); - CreateImageWithSmallImages(IMG_SAND); -#endif - - printf("DONE!\n"); - } } static void ReinitializeSounds() { - InitElementSoundInfo(); /* element => game sound mapping */ - InitSoundInfo(); /* sound => properties mapping */ + InitElementSoundInfo(); /* element game sound mapping */ + InitSoundInfo(); /* sound properties mapping */ InitPlaySoundLevel(); /* internal game sound settings */ } @@ -310,9 +266,11 @@ static void ReinitializeMusic() static void InitImages() { ReloadCustomImages(); - ReinitializeGraphics(); LoadCustomElementDescriptions(); + LoadSpecialMenuDesignSettings(); + + ReinitializeGraphics(); } static void InitSound() @@ -503,9 +461,17 @@ void FreeTileClipmasks() void InitGfx() { -#if 0 + char *config_token_font_initial = "font.small"; + char *filename_font_initial = NULL; int i; -#endif + + /* determine filename for initial font (for displaying startup messages) */ + for (i=0; image_config[i].token != NULL; i++) + if (strcmp(image_config[i].token, config_token_font_initial) == 0) + filename_font_initial = image_config[i].value; + + if (filename_font_initial == NULL) /* should not happen */ + Error(ERR_EXIT, "cannot get filename for '%s'", config_token_font_initial); /* initialize screen properties */ InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE, @@ -518,40 +484,15 @@ void InitGfx() 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]); + bitmap_font_initial = LoadCustomImage(filename_font_initial); 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; i -1; i++) CreateImageWithSmallImages(element_to_graphic[i].graphic); + /* initialize special images from static configuration */ + for (i=0; element_to_special_graphic[i].element > -1; i++) + CreateImageWithSmallImages(element_to_special_graphic[i].graphic); + /* initialize images from dynamic configuration */ for (i=0; i < num_property_mappings; i++) CreateImageWithSmallImages(property_mapping[i].artwork_index); @@ -773,6 +715,7 @@ void InitElementGraphicInfo() } } +#if 0 for (i=EL_CHAR_START; i<=EL_CHAR_END; i++) element_info[i].graphic[ACTION_DEFAULT] = IMG_CHAR_START + (i - EL_CHAR_START); @@ -780,6 +723,7 @@ void InitElementGraphicInfo() for (i=EL_CUSTOM_START; i<=EL_CUSTOM_END; i++) element_info[i].graphic[ACTION_DEFAULT] = IMG_CUSTOM_START + (i - EL_CUSTOM_START); +#endif /* initialize normal element/graphic mapping from static configuration */ for (i=0; element_to_graphic[i].element > -1; i++) @@ -857,9 +801,22 @@ void InitElementGraphicInfo() element_info[i].graphic[act] = default_action_graphic; } } + +#if 0 +#if DEBUG + if (options.verbose) + { + for (i=0; i -1; i++) @@ -875,11 +835,16 @@ void InitElementEditorGraphicInfo() int element = element_to_special_graphic[i].element; int special = element_to_special_graphic[i].special; int graphic = element_to_special_graphic[i].graphic; + boolean base_redefined = getImageListEntry(el2img(element))->redefined; + boolean special_redefined = getImageListEntry(graphic)->redefined; - if (special != GFX_SPECIAL_ARG_EDITOR) + if (base_redefined && !special_redefined) continue; - element_info[element].editor_graphic = graphic; + if (special == GFX_SPECIAL_ARG_EDITOR) + element_info[element].editor_graphic = graphic; + else if (special == GFX_SPECIAL_ARG_PREVIEW) + element_info[element].preview_graphic = graphic; } /* initialize special element/graphic mapping from dynamic configuration */ @@ -889,36 +854,73 @@ void InitElementEditorGraphicInfo() int special = property_mapping[i].ext3_index; int graphic = property_mapping[i].artwork_index; - if (special != GFX_SPECIAL_ARG_EDITOR) - continue; - - element_info[element].editor_graphic = graphic; + if (special == GFX_SPECIAL_ARG_EDITOR) + element_info[element].editor_graphic = graphic; + else if (special == GFX_SPECIAL_ARG_PREVIEW) + element_info[element].preview_graphic = graphic; } } static void InitElementSoundInfo() { - /* soon to come */ + /* !!! soon to come !!! */ } -static void set_graphic_parameters(int graphic, int *parameter) +static void set_graphic_parameters(int graphic, char **parameter_raw) { Bitmap *src_bitmap = getBitmapFromImageID(graphic); int num_xtiles = (src_bitmap ? src_bitmap->width : TILEX) / TILEX; int num_ytiles = (src_bitmap ? src_bitmap->height * 2 / 3 : TILEY) / TILEY; + int parameter[NUM_GFX_ARGS]; + int i; - graphic_info[graphic].bitmap = src_bitmap; + /* get integer values from string parameters */ + for (i=0; i < NUM_GFX_ARGS; i++) + parameter[i] = + get_parameter_value(image_config_suffix[i].type, parameter_raw[i]); - graphic_info[graphic].src_x = parameter[GFX_ARG_XPOS] * TILEX; - graphic_info[graphic].src_y = parameter[GFX_ARG_YPOS] * TILEY; - graphic_info[graphic].offset_x = parameter[GFX_ARG_OFFSET]; - graphic_info[graphic].offset_y = 0; + graphic_info[graphic].bitmap = src_bitmap; - /* animation frames are ordered vertically instead of horizontally */ - if (parameter[GFX_ARG_VERTICAL]) + /* start with reliable default values */ + graphic_info[graphic].src_x = 0; + graphic_info[graphic].src_y = 0; + graphic_info[graphic].width = TILEX; + graphic_info[graphic].height = TILEY; + graphic_info[graphic].offset_x = 0; /* one or both of these values ... */ + graphic_info[graphic].offset_y = 0; /* ... will be corrected later */ + + /* optional x and y tile position of animation frame sequence */ + if (parameter[GFX_ARG_XPOS] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].src_x = parameter[GFX_ARG_XPOS] * TILEX; + if (parameter[GFX_ARG_YPOS] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].src_y = parameter[GFX_ARG_YPOS] * TILEY; + + /* optional x and y pixel position of animation frame sequence */ + if (parameter[GFX_ARG_X] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].src_x = parameter[GFX_ARG_X]; + if (parameter[GFX_ARG_Y] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].src_y = parameter[GFX_ARG_Y]; + + /* optional width and height of each animation frame */ + if (parameter[GFX_ARG_WIDTH] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].width = parameter[GFX_ARG_WIDTH]; + if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].height = parameter[GFX_ARG_HEIGHT]; + + /* correct x or y offset dependant of vertical or horizontal frame order */ + if (parameter[GFX_ARG_VERTICAL]) /* frames are ordered vertically */ + { + if (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].offset_y = parameter[GFX_ARG_OFFSET]; + else + graphic_info[graphic].offset_y = graphic_info[graphic].height; + } + else /* frames are ordered horizontally */ { - graphic_info[graphic].offset_x = 0; - graphic_info[graphic].offset_y = parameter[GFX_ARG_OFFSET]; + if (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].offset_x = parameter[GFX_ARG_OFFSET]; + else + graphic_info[graphic].offset_x = graphic_info[graphic].width; } /* optionally, the x and y offset of frames can be specified directly */ @@ -972,11 +974,18 @@ static void set_graphic_parameters(int graphic, int *parameter) /* animation synchronized with global frame counter, not move position */ graphic_info[graphic].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC]; + + /* this is only used for toon animations */ + graphic_info[graphic].step_offset = parameter[GFX_ARG_STEP_OFFSET]; + graphic_info[graphic].step_delay = parameter[GFX_ARG_STEP_DELAY]; } static void InitGraphicInfo() { static boolean clipmasks_initialized = FALSE; + int fallback_graphic = IMG_CHAR_EXCLAM; + struct FileInfo *fallback_image = getImageListEntry(fallback_graphic); + Bitmap *fallback_bitmap = getBitmapFromImageID(fallback_graphic); int num_images = getImageListSize(); int i; #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) @@ -1039,9 +1048,15 @@ static void InitGraphicInfo() "error: first animation frame out of bounds (%d, %d)", src_x, src_y); Error(ERR_RETURN, "custom graphic rejected for this element/action"); + + if (i == fallback_graphic) + Error(ERR_EXIT, "fatal error: no fallback graphic available"); + + Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic"); Error(ERR_RETURN_LINE, "-"); - set_graphic_parameters(i, image->default_parameter); + set_graphic_parameters(i, fallback_image->default_parameter); + graphic_info[i].bitmap = fallback_bitmap; } last_frame = graphic_info[i].anim_frames - 1; @@ -1062,9 +1077,15 @@ static void InitGraphicInfo() "error: last animation frame (%d) out of bounds (%d, %d)", last_frame, src_x, src_y); Error(ERR_RETURN, "custom graphic rejected for this element/action"); + + if (i == fallback_graphic) + Error(ERR_EXIT, "fatal error: no fallback graphic available"); + + Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic"); Error(ERR_RETURN_LINE, "-"); - set_graphic_parameters(i, image->default_parameter); + set_graphic_parameters(i, fallback_image->default_parameter); + graphic_info[i].bitmap = fallback_bitmap; } #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) @@ -1102,8 +1123,16 @@ static void InitGraphicInfo() clipmasks_initialized = TRUE; } -static void set_sound_parameters(int sound, int *parameter) +static void set_sound_parameters(int sound, char **parameter_raw) { + int parameter[NUM_SND_ARGS]; + int i; + + /* get integer values from string parameters */ + for (i=0; i < NUM_SND_ARGS; i++) + parameter[i] = + get_parameter_value(sound_config_suffix[i].type, parameter_raw[i]); + /* explicit loop mode setting in configuration overrides default value */ if (parameter[SND_ARG_MODE_LOOP] != ARG_UNDEFINED_VALUE) sound_info[sound].loop = parameter[SND_ARG_MODE_LOOP]; @@ -1672,14 +1701,6 @@ void InitElementProperties() EL_EMERALD_RED, EL_EMERALD_PURPLE, EL_DIAMOND, - EL_KEY1, - EL_KEY2, - EL_KEY3, - EL_KEY4, - EL_EM_KEY1, - EL_EM_KEY2, - EL_EM_KEY3, - EL_EM_KEY4, EL_BOMB, EL_NUT, EL_AMOEBA_DROP,