X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=5f05b082af4a6367e2bbffe75b4eecc38b828f8b;hb=a95264fc39b6eae2473bfd6521c7bf3eef5af804;hp=b6eaa561e4c7fb49eac287cf498925eb56dcffa0;hpb=078d932701464a5152c3889007e5818f87f609c7;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index b6eaa561..5f05b082 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,17 +166,16 @@ 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[] = { "name", "sort_priority", - "menu.main.hide_static_text", "global.num_toons", NULL }; @@ -185,22 +187,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 ---------- */ + + /* 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++; + } + } - for (i=0; i < num_fonts; i++) + /* 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 +895,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 +921,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) @@ -880,14 +990,13 @@ void InitElementSpecialGraphicInfo() { struct PropertyMapping *property_mapping = getImageListPropertyMapping(); int num_property_mappings = getImageListPropertyMappingSize(); - int i; + int i, j; /* always start with reliable default values */ - for (i=0; i -1; i++) @@ -901,10 +1010,7 @@ void InitElementSpecialGraphicInfo() if (base_redefined && !special_redefined) continue; - 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; + element_info[element].special_graphic[special] = graphic; } /* initialize special element/graphic mapping from dynamic configuration */ @@ -914,10 +1020,11 @@ void InitElementSpecialGraphicInfo() int special = property_mapping[i].ext3_index; int graphic = property_mapping[i].artwork_index; - 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; + if (element >= MAX_NUM_ELEMENTS) + continue; + + if (special >= 0 && special < NUM_SPECIAL_GFX_ARGS) + element_info[element].special_graphic[special] = graphic; } } @@ -932,7 +1039,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; @@ -998,25 +1106,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) @@ -1197,7 +1290,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) @@ -2137,6 +2231,7 @@ void InitElementProperties() EL_DYNABOMB_NR, EL_DYNABOMB_SZ, EL_DYNABOMB_XL, + EL_SP_DISK_RED_ACTIVE, EL_BUG, EL_MOLE, EL_PENGUIN, @@ -2324,7 +2419,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);