X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=b24944ee7aa95eb5302e9a8f29ecd48e4f2f2d12;hb=5a5342a6ab48037839b783adc4f3304331834a8c;hp=73f9274f35ae3e305be46718b5939ebd8da2b97c;hpb=81d6b6bda96a976884b3945b15a8aba126e0a157;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 73f9274f..b24944ee 100644 --- a/src/init.c +++ b/src/init.c @@ -28,10 +28,11 @@ #include "conf_e2g.c" /* include auto-generated data structure definitions */ #include "conf_esg.c" /* include auto-generated data structure definitions */ +#include "conf_fnt.c" /* include auto-generated data structure definitions */ #define CONFIG_TOKEN_FONT_INITIAL "font.initial" -struct FontInfo font_info_initial[NUM_INITIAL_FONTS]; +struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS]; static void InitGlobal(); static void InitSetup(); @@ -117,6 +118,8 @@ void OpenAll() return; } + game_status = MAINMENU; + DrawMainMenu(); InitNetworkServer(); @@ -163,11 +166,11 @@ static void InitArtworkInfo() static void InitArtworkConfig() { - static char *element_prefix[MAX_NUM_ELEMENTS + 1]; - static char *sound_class_prefix[MAX_NUM_ELEMENTS + 1]; - static char *action_suffix[NUM_ACTIONS + 1]; - static char *direction_suffix[NUM_DIRECTIONS + 1]; - static char *special_suffix[NUM_SPECIAL_GFX_ARGS + 1]; + static char *image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + 1]; + static char *sound_id_prefix[MAX_NUM_ELEMENTS + 1]; + static char *action_id_suffix[NUM_ACTIONS + 1]; + static char *direction_id_suffix[NUM_DIRECTIONS + 1]; + static char *special_id_suffix[NUM_SPECIAL_GFX_ARGS + 1]; static char *dummy[1] = { NULL }; static char *ignore_image_tokens[] = { @@ -185,22 +188,28 @@ static void InitArtworkConfig() }; int i; + for (i=0; i -1; i++) CreateImageWithSmallImages(element_to_special_graphic[i].graphic); - /* !!! CHECK FOR ELEMENT-ONLY GRAPHICS !!! */ /* initialize images from dynamic configuration */ for (i=0; i < num_property_mappings; i++) - CreateImageWithSmallImages(property_mapping[i].artwork_index); + if (property_mapping[i].artwork_index < MAX_NUM_ELEMENTS) + CreateImageWithSmallImages(property_mapping[i].artwork_index); +} + +static int getFontBitmapID(int font_nr) +{ + int special = -1; + + if (game_status == MAINMENU || game_status == TYPENAME) + special = GFX_SPECIAL_ARG_MAIN; + else if (game_status == CHOOSELEVEL) + special = GFX_SPECIAL_ARG_LEVELS; + else if (game_status == HALLOFFAME) + special = GFX_SPECIAL_ARG_SCORES; + else if (game_status == LEVELED) + special = GFX_SPECIAL_ARG_EDITOR; + else if (game_status == HELPSCREEN) + special = GFX_SPECIAL_ARG_INFO; + else if (game_status == SETUP) + special = GFX_SPECIAL_ARG_SETUP; + else if (game_status == PSEUDO_PREVIEW) + special = GFX_SPECIAL_ARG_PREVIEW; + else if (game_status == PLAYING || game_status == PSEUDO_DOOR) + special = GFX_SPECIAL_ARG_DOOR; + + if (special != -1) + return font_info[font_nr].special_bitmap_id[special]; + else + return font_nr; } void InitFontGraphicInfo() { - static struct FontInfo font_info[NUM_IMG_FONTS]; - int num_fonts = NUM_IMG_FONTS; - int i; + static struct FontBitmapInfo *font_bitmap_info = NULL; + struct PropertyMapping *property_mapping = getImageListPropertyMapping(); + int num_property_mappings = getImageListPropertyMappingSize(); + int num_font_bitmaps = NUM_FONTS; + int i, j; if (graphic_info == NULL) /* still at startup phase */ - num_fonts = NUM_INITIAL_FONTS; + { + InitFontInfo(font_initial, NUM_INITIAL_FONTS, getFontBitmapID); + + return; + } + + /* ---------- initialize font graphic definitions ---------- */ - for (i=0; i < num_fonts; i++) + /* always start with reliable default values (normal font graphics) */ + for (i=0; i < NUM_FONTS; i++) + font_info[i].graphic = FONT_INITIAL_1; + + /* initialize normal font/graphic mapping from static configuration */ + for (i=0; font_to_graphic[i].font_nr > -1; i++) + { + int font_nr = font_to_graphic[i].font_nr; + int special = font_to_graphic[i].special; + int graphic = font_to_graphic[i].graphic; + + if (special != -1) + continue; + + font_info[font_nr].graphic = graphic; + } + + /* always start with reliable default values (special font graphics) */ + for (i=0; i < NUM_FONTS; i++) + { + for (j=0; j < NUM_SPECIAL_GFX_ARGS; j++) + { + font_info[i].special_graphic[j] = font_info[i].graphic; + font_info[i].special_bitmap_id[j] = i; + } + } + + /* initialize special font/graphic mapping from static configuration */ + for (i=0; font_to_graphic[i].font_nr > -1; i++) + { + int font_nr = font_to_graphic[i].font_nr; + int special = font_to_graphic[i].special; + int graphic = font_to_graphic[i].graphic; + + if (special >= 0 && special < NUM_SPECIAL_GFX_ARGS) + { + font_info[font_nr].special_graphic[special] = graphic; + font_info[font_nr].special_bitmap_id[special] = num_font_bitmaps; + num_font_bitmaps++; + } + } + + /* initialize special element/graphic mapping from dynamic configuration */ + for (i=0; i < num_property_mappings; i++) + { + int font_nr = property_mapping[i].base_index - MAX_NUM_ELEMENTS; + int special = property_mapping[i].ext3_index; + int graphic = property_mapping[i].artwork_index; + + if (font_nr < 0) + continue; + + if (special >= 0 && special < NUM_SPECIAL_GFX_ARGS) + { + font_info[font_nr].special_graphic[special] = graphic; + font_info[font_nr].special_bitmap_id[special] = num_font_bitmaps; + num_font_bitmaps++; + } + } + + /* ---------- initialize font bitmap array ---------- */ + + if (font_bitmap_info != NULL) + free(font_bitmap_info); + + font_bitmap_info = + checked_calloc(num_font_bitmaps * sizeof(struct FontBitmapInfo)); + + /* ---------- initialize font bitmap definitions ---------- */ + + for (i=0; i < NUM_FONTS; i++) { if (i < NUM_INITIAL_FONTS) - font_info[i] = font_info_initial[i]; - else { + font_bitmap_info[i] = font_initial[i]; + continue; + } + + for (j=0; j < NUM_SPECIAL_GFX_ARGS; j++) + { + int font_bitmap_id = font_info[i].special_bitmap_id[j]; + int graphic = font_info[i].special_graphic[j]; + /* copy font relevant information from graphics information */ - font_info[i].bitmap = graphic_info[FIRST_IMG_FONT + i].bitmap; - font_info[i].src_x = graphic_info[FIRST_IMG_FONT + i].src_x; - font_info[i].src_y = graphic_info[FIRST_IMG_FONT + i].src_y; - font_info[i].width = graphic_info[FIRST_IMG_FONT + i].width; - font_info[i].height = graphic_info[FIRST_IMG_FONT + i].height; - font_info[i].draw_x = graphic_info[FIRST_IMG_FONT + i].draw_x; - font_info[i].draw_y = graphic_info[FIRST_IMG_FONT + i].draw_y; + font_bitmap_info[font_bitmap_id].bitmap = graphic_info[graphic].bitmap; + font_bitmap_info[font_bitmap_id].src_x = graphic_info[graphic].src_x; + font_bitmap_info[font_bitmap_id].src_y = graphic_info[graphic].src_y; + font_bitmap_info[font_bitmap_id].width = graphic_info[graphic].width; + font_bitmap_info[font_bitmap_id].height = graphic_info[graphic].height; + font_bitmap_info[font_bitmap_id].draw_x = graphic_info[graphic].draw_x; + font_bitmap_info[font_bitmap_id].draw_y = graphic_info[graphic].draw_y; } } - InitFontInfo(font_info, num_fonts); + InitFontInfo(font_bitmap_info, num_font_bitmaps, getFontBitmapID); } void InitElementGraphicInfo() @@ -775,16 +896,6 @@ 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); - - 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++) { @@ -811,7 +922,7 @@ void InitElementGraphicInfo() int special = property_mapping[i].ext3_index; int graphic = property_mapping[i].artwork_index; - if (special != -1) + if (element >= MAX_NUM_ELEMENTS || special != -1) continue; if (action < 0) @@ -910,6 +1021,9 @@ void InitElementSpecialGraphicInfo() int special = property_mapping[i].ext3_index; int graphic = property_mapping[i].artwork_index; + if (element >= MAX_NUM_ELEMENTS) + continue; + if (special >= 0 && special < NUM_SPECIAL_GFX_ARGS) element_info[element].special_graphic[special] = graphic; } @@ -926,7 +1040,8 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) /* 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]); + get_parameter_value(image_config_suffix[i].token, parameter_raw[i], + image_config_suffix[i].type); graphic_info[graphic].bitmap = src_bitmap; @@ -992,25 +1107,10 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) if (graphic_info[graphic].anim_delay == 0) /* delay must be at least 1 */ graphic_info[graphic].anim_delay = 1; - /* set mode for animation frame order */ - if (parameter[GFX_ARG_MODE_LOOP]) - graphic_info[graphic].anim_mode = ANIM_LOOP; - else if (parameter[GFX_ARG_MODE_LINEAR]) - graphic_info[graphic].anim_mode = ANIM_LINEAR; - else if (parameter[GFX_ARG_MODE_PINGPONG]) - graphic_info[graphic].anim_mode = ANIM_PINGPONG; - else if (parameter[GFX_ARG_MODE_PINGPONG2]) - graphic_info[graphic].anim_mode = ANIM_PINGPONG2; - else if (parameter[GFX_ARG_MODE_RANDOM]) - graphic_info[graphic].anim_mode = ANIM_RANDOM; + if (parameter[GFX_ARG_ANIM_MODE] != ANIM_NONE) + graphic_info[graphic].anim_mode = parameter[GFX_ARG_ANIM_MODE]; else if (graphic_info[graphic].anim_frames > 1) graphic_info[graphic].anim_mode = ANIM_LOOP; - else - graphic_info[graphic].anim_mode = ANIM_NONE; - - /* set additional flag to play animation frames in reverse order */ - if (parameter[GFX_ARG_MODE_REVERSE]) - graphic_info[graphic].anim_mode |= ANIM_REVERSE; /* automatically determine correct start frame, if not defined */ if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE) @@ -1191,7 +1291,8 @@ static void set_sound_parameters(int sound, char **parameter_raw) /* 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]); + get_parameter_value(sound_config_suffix[i].token, parameter_raw[i], + sound_config_suffix[i].type); /* explicit loop mode setting in configuration overrides default value */ if (parameter[SND_ARG_MODE_LOOP] != ARG_UNDEFINED_VALUE) @@ -2131,6 +2232,7 @@ void InitElementProperties() EL_DYNABOMB_NR, EL_DYNABOMB_SZ, EL_DYNABOMB_XL, + EL_SP_DISK_RED_ACTIVE, EL_BUG, EL_MOLE, EL_PENGUIN, @@ -2318,7 +2420,8 @@ void InitElementProperties() EL_DYNABOMB_PLAYER1_ACTIVE, EL_DYNABOMB_PLAYER2_ACTIVE, EL_DYNABOMB_PLAYER3_ACTIVE, - EL_DYNABOMB_PLAYER4_ACTIVE + EL_DYNABOMB_PLAYER4_ACTIVE, + EL_SP_DISK_RED_ACTIVE }; static int ep_active_bomb_num = SIZEOF_ARRAY_INT(ep_active_bomb);