X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=3dcfe04e8358b4370643f3f1e22450fcd571cab9;hb=91d08fad2fcec7e2b5931b4f336a89d14af313dd;hp=2b7836e2c2a8633f9e7925c15d554bc9b4e6fb64;hpb=7b47ce7ba0f673f0de5130daf5726104d0b38902;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 2b7836e2..3dcfe04e 100644 --- a/src/init.c +++ b/src/init.c @@ -27,6 +27,7 @@ #include "config.h" #include "conf_e2g.c" /* include auto-generated data structure definitions */ +#include "conf_esg.c" /* include auto-generated data structure definitions */ static char *image_filename[NUM_PICTURES] = @@ -57,28 +58,31 @@ static char *image_filename[NUM_PICTURES] = static Bitmap *bitmap_font_initial = NULL; -static void InitGlobal(void); -static void InitSetup(void); -static void InitPlayerInfo(void); -static void InitLevelInfo(void); -static void InitArtworkInfo(void); -static void InitLevelArtworkInfo(void); -static void InitNetworkServer(void); -static void InitArtworkConfig(void); -static void InitImages(void); -static void InitMixer(void); -static void InitSound(void); -static void InitMusic(void); -static void InitGfx(void); -static void InitGfxBackground(void); -static void InitGadgets(void); -static void InitElementProperties(void); -static void InitElementInfo(void); -static void InitGraphicInfo(void); +static void InitGlobal(); +static void InitSetup(); +static void InitPlayerInfo(); +static void InitLevelInfo(); +static void InitArtworkInfo(); +static void InitLevelArtworkInfo(); +static void InitNetworkServer(); +static void InitArtworkConfig(); +static void InitImages(); +static void InitMixer(); +static void InitSound(); +static void InitMusic(); +static void InitGfx(); +static void InitGfxBackground(); +static void InitGadgets(); +static void InitElementImages(); +static void InitElementGraphicInfo(); +static void InitElementEditorGraphicInfo(); +static void InitElementSoundInfo(); +static void InitElementProperties(); +static void InitGraphicInfo(); static void InitSoundInfo(); static void Execute_Command(char *); -void OpenAll(void) +void OpenAll() { InitGlobal(); /* initialize some global variables */ @@ -119,7 +123,6 @@ void OpenAll(void) InitEventFilter(FilterMouseMotionEvents); InitElementProperties(); - InitElementInfo(); InitGfx(); @@ -184,21 +187,29 @@ static void InitArtworkInfo() static void InitArtworkConfig() { - static struct ConfigInfo action_suffix[NUM_ACTIONS + 1]; - static struct ConfigInfo direction_suffix[NUM_DIRECTIONS + 1]; - static struct ConfigInfo empty[1]; + 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 *dummy[1] = { NULL }; int i; + for (i=0; i game graphic mapping */ + InitElementEditorGraphicInfo(); /* element => editor graphic mapping */ + InitGraphicInfo(); /* graphic => properties mapping */ InitFontInfo(bitmap_font_initial, graphic_info[IMG_FONT_BIG].bitmap, @@ -250,11 +263,43 @@ 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() { - InitSoundInfo(); /* initialize sounds info from config file */ + InitElementSoundInfo(); /* element => game sound mapping */ + InitSoundInfo(); /* sound => properties mapping */ + + InitPlaySoundLevel(); /* internal game sound settings */ } static void ReinitializeMusic() @@ -266,6 +311,8 @@ static void InitImages() { ReloadCustomImages(); ReinitializeGraphics(); + + LoadCustomElementDescriptions(); } static void InitSound() @@ -610,6 +657,8 @@ void ReloadCustomArtwork() ReloadCustomImages(); ReinitializeGraphics(); + LoadCustomElementDescriptions(); + FreeTileClipmasks(); InitTileClipmasks(); @@ -691,8 +740,25 @@ void InitGadgets() gadgets_initialized = TRUE; } -void InitElementInfo() +void InitElementImages() +{ + struct PropertyMapping *property_mapping = getImageListPropertyMapping(); + int num_property_mappings = getImageListPropertyMappingSize(); + int i; + + /* initialize images from static configuration */ + for (i=0; element_to_graphic[i].element > -1; i++) + CreateImageWithSmallImages(element_to_graphic[i].graphic); + + /* initialize images from dynamic configuration */ + for (i=0; i < num_property_mappings; i++) + CreateImageWithSmallImages(property_mapping[i].artwork_index); +} + +void InitElementGraphicInfo() { + struct PropertyMapping *property_mapping = getImageListPropertyMapping(); + int num_property_mappings = getImageListPropertyMappingSize(); int i, act, dir; /* set values to -1 to identify later as "uninitialized" values */ @@ -715,27 +781,42 @@ void InitElementInfo() element_info[i].graphic[ACTION_DEFAULT] = IMG_CUSTOM_START + (i - EL_CUSTOM_START); - i = 0; - while (element_to_graphic[i].element > -1) + /* initialize normal element/graphic mapping from static configuration */ + for (i=0; element_to_graphic[i].element > -1; i++) { int element = element_to_graphic[i].element; - int direction = element_to_graphic[i].direction; int action = element_to_graphic[i].action; + int direction = element_to_graphic[i].direction; int graphic = element_to_graphic[i].graphic; if (action < 0) action = ACTION_DEFAULT; if (direction > -1) - { - direction = MV_DIR_BIT(direction); - element_info[element].direction_graphic[action][direction] = graphic; - } else element_info[element].graphic[action] = graphic; + } + + /* initialize normal element/graphic mapping from dynamic configuration */ + for (i=0; i < num_property_mappings; i++) + { + int element = property_mapping[i].base_index; + int action = property_mapping[i].ext1_index; + int direction = property_mapping[i].ext2_index; + int special = property_mapping[i].ext3_index; + int graphic = property_mapping[i].artwork_index; - i++; + if (special != -1) + continue; + + if (action < 0) + action = ACTION_DEFAULT; + + if (direction > -1) + element_info[element].direction_graphic[action][direction] = graphic; + else + element_info[element].graphic[action] = graphic; } /* now set all '-1' values to element specific default values */ @@ -778,6 +859,48 @@ void InitElementInfo() } } +void InitElementEditorGraphicInfo() +{ + struct PropertyMapping *property_mapping = getImageListPropertyMapping(); + int num_property_mappings = getImageListPropertyMappingSize(); + int i; + + /* always start with reliable default values */ + for (i=0; i -1; i++) + { + int element = element_to_special_graphic[i].element; + int special = element_to_special_graphic[i].special; + int graphic = element_to_special_graphic[i].graphic; + + if (special != GFX_SPECIAL_ARG_EDITOR) + continue; + + element_info[element].editor_graphic = graphic; + } + + /* initialize special element/graphic mapping from dynamic configuration */ + for (i=0; i < num_property_mappings; i++) + { + int element = property_mapping[i].base_index; + 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; + } +} + +static void InitElementSoundInfo() +{ + /* soon to come */ +} + static void set_graphic_parameters(int graphic, int *parameter) { Bitmap *src_bitmap = getBitmapFromImageID(graphic); @@ -854,6 +977,7 @@ static void set_graphic_parameters(int graphic, int *parameter) static void InitGraphicInfo() { static boolean clipmasks_initialized = FALSE; + int num_images = getImageListSize(); int i; #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) Pixmap src_pixmap; @@ -862,12 +986,15 @@ static void InitGraphicInfo() GC copy_clipmask_gc = None; #endif - image_files = getCurrentImageList(); + if (graphic_info != NULL) + free(graphic_info); + + graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo)); #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) if (clipmasks_initialized) { - for (i=0; iparameter); /* now check if no animation frames are outside of the loaded image */ @@ -913,7 +1041,7 @@ static void InitGraphicInfo() Error(ERR_RETURN, "custom graphic rejected for this element/action"); Error(ERR_RETURN_LINE, "-"); - set_graphic_parameters(i, image_files[i].default_parameter); + set_graphic_parameters(i, image->default_parameter); } last_frame = graphic_info[i].anim_frames - 1; @@ -936,7 +1064,7 @@ static void InitGraphicInfo() Error(ERR_RETURN, "custom graphic rejected for this element/action"); Error(ERR_RETURN_LINE, "-"); - set_graphic_parameters(i, image_files[i].default_parameter); + set_graphic_parameters(i, image->default_parameter); } #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) @@ -983,19 +1111,25 @@ static void set_sound_parameters(int sound, int *parameter) static void InitSoundInfo() { - int sound_effect_properties[NUM_SOUND_FILES]; + int *sound_effect_properties; + int num_sounds = getSoundListSize(); int i, j; - sound_files = getCurrentSoundList(); + if (sound_info != NULL) + free(sound_info); + + sound_effect_properties = checked_calloc(num_sounds * sizeof(int)); + sound_info = checked_calloc(num_sounds * sizeof(struct SoundInfo)); /* initialize sound effect for all elements to "no sound" */ for (i=0; itoken); sound_effect_properties[i] = ACTION_OTHER; sound_info[i].loop = FALSE; @@ -1007,7 +1141,7 @@ static void InitSoundInfo() int len_action_text = strlen(element_action_info[j].suffix); if (len_action_text < len_effect_text && - strcmp(&sound_files[i].token[len_effect_text - len_action_text], + strcmp(&sound->token[len_effect_text - len_action_text], element_action_info[j].suffix) == 0) { sound_effect_properties[i] = element_action_info[j].value; @@ -1026,9 +1160,9 @@ static void InitSoundInfo() int len_class_text = strlen(element_info[j].sound_class_name); if (len_class_text + 1 < len_effect_text && - strncmp(sound_files[i].token, + strncmp(sound->token, element_info[j].sound_class_name, len_class_text) == 0 && - sound_files[i].token[len_class_text] == '.') + sound->token[len_class_text] == '.') { int sound_action_value = sound_effect_properties[i]; @@ -1037,9 +1171,11 @@ static void InitSoundInfo() } } - set_sound_parameters(i, sound_files[i].parameter); + set_sound_parameters(i, sound->parameter); } + free(sound_effect_properties); + #if 0 /* TEST ONLY */ {