X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=c614643e8d2bd8adf1e10c6bdd181f61d423f076;hb=c9bb6e0a6eecbf84320be79b121bd957a938a08c;hp=9a68e2ad5ebc7b8c0c38f07078c6846320f05a17;hpb=d5224fde97c235c903f631a4eccb9904c2ddf9c3;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 9a68e2ad..c614643e 100644 --- a/src/init.c +++ b/src/init.c @@ -428,6 +428,19 @@ void InitElementGraphicInfo() if (graphic_info[graphic].bitmap == NULL) continue; + if ((action > -1 || direction > -1) && el2img(element) != -1) + { + boolean base_redefined = getImageListEntry(el2img(element))->redefined; + boolean act_dir_redefined = getImageListEntry(graphic)->redefined; + + /* if the base graphic ("emerald", for example) has been redefined, + but not the action graphic ("emerald.falling", for example), do not + use an existing (in this case considered obsolete) action graphic + anymore, but use the automatically determined default graphic */ + if (base_redefined && !act_dir_redefined) + continue; + } + if (action < 0) action = ACTION_DEFAULT; @@ -455,6 +468,10 @@ void InitElementGraphicInfo() if (action < 0) action = ACTION_DEFAULT; + if (direction < 0) + for (dir=0; dir -1) element_info[element].direction_graphic[action][direction] = graphic; else @@ -464,45 +481,59 @@ void InitElementGraphicInfo() /* now set all '-1' values to element specific default values */ for (i=0; iredefined; boolean special_redefined = getImageListEntry(graphic)->redefined; + /* if the base graphic ("emerald", for example) has been redefined, + but not the special graphic ("emerald.EDITOR", for example), do not + use an existing (in this case considered obsolete) special graphic + anymore, but use the automatically created (down-scaled) graphic */ if (base_redefined && !special_redefined) continue; @@ -851,48 +886,61 @@ static void InitElementSoundInfo() element_info[j].sound[action] = sound; } - /* initialize element/sound mapping from dynamic configuration */ + /* initialize element class/sound 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 sound = property_mapping[i].artwork_index; + int element_class = property_mapping[i].base_index - MAX_NUM_ELEMENTS; + int action = property_mapping[i].ext1_index; + int sound = property_mapping[i].artwork_index; - if (element >= MAX_NUM_ELEMENTS) + if (element_class < 0 || element_class >= MAX_NUM_ELEMENTS) continue; if (action < 0) action = ACTION_DEFAULT; - element_info[element].sound[action] = sound; + for (j=0; j < MAX_NUM_ELEMENTS; j++) + if (strcmp(element_info[j].class_name, + element_info[element_class].class_name) == 0) + element_info[j].sound[action] = sound; } - /* initialize element class/sound mapping from dynamic configuration */ + /* initialize element/sound mapping from dynamic configuration */ for (i=0; i < num_property_mappings; i++) { - int element_class = property_mapping[i].base_index - MAX_NUM_ELEMENTS; - int action = property_mapping[i].ext1_index; - int sound = property_mapping[i].artwork_index; + int element = property_mapping[i].base_index; + int action = property_mapping[i].ext1_index; + int sound = property_mapping[i].artwork_index; - if (element_class < 0 || element_class >= MAX_NUM_ELEMENTS) + if (element >= MAX_NUM_ELEMENTS) continue; if (action < 0) action = ACTION_DEFAULT; - for (j=0; j < MAX_NUM_ELEMENTS; j++) - if (strcmp(element_info[j].class_name, - element_info[element_class].class_name) == 0) - element_info[j].sound[action] = sound; + element_info[element].sound[action] = sound; } /* now set all '-1' values to element specific default values */ for (i=0; i= EL_CHAR_START && i <= EL_CHAR_END) SET_PROPERTY(i, EP_INACTIVE, TRUE); /* ---------- WALKABLE, PASSABLE, ACCESSIBLE --------------------------- */ - if (IS_WALKABLE_OVER(i) || IS_WALKABLE_INSIDE(i) || IS_WALKABLE_UNDER(i)) - SET_PROPERTY(i, EP_WALKABLE, TRUE); + SET_PROPERTY(i, EP_WALKABLE, (IS_WALKABLE_OVER(i) || + IS_WALKABLE_INSIDE(i) || + IS_WALKABLE_UNDER(i))); - if (IS_PASSABLE_OVER(i) || IS_PASSABLE_INSIDE(i) || IS_PASSABLE_UNDER(i)) - SET_PROPERTY(i, EP_PASSABLE, TRUE); + SET_PROPERTY(i, EP_PASSABLE, (IS_PASSABLE_OVER(i) || + IS_PASSABLE_INSIDE(i) || + IS_PASSABLE_UNDER(i))); - if (IS_WALKABLE_OVER(i) || IS_PASSABLE_OVER(i)) - SET_PROPERTY(i, EP_ACCESSIBLE_OVER, TRUE); + SET_PROPERTY(i, EP_ACCESSIBLE_OVER, (IS_WALKABLE_OVER(i) || + IS_PASSABLE_OVER(i))); - if (IS_WALKABLE_INSIDE(i) || IS_PASSABLE_INSIDE(i)) - SET_PROPERTY(i, EP_ACCESSIBLE_INSIDE, TRUE); + SET_PROPERTY(i, EP_ACCESSIBLE_INSIDE, (IS_WALKABLE_INSIDE(i) || + IS_PASSABLE_INSIDE(i))); - if (IS_WALKABLE_UNDER(i) || IS_PASSABLE_UNDER(i)) - SET_PROPERTY(i, EP_ACCESSIBLE_UNDER, TRUE); + SET_PROPERTY(i, EP_ACCESSIBLE_UNDER, (IS_WALKABLE_UNDER(i) || + IS_PASSABLE_UNDER(i))); - if (IS_WALKABLE(i) || IS_PASSABLE(i)) - SET_PROPERTY(i, EP_ACCESSIBLE, TRUE); + SET_PROPERTY(i, EP_ACCESSIBLE, (IS_WALKABLE(i) || + IS_PASSABLE(i))); + + /* ---------- SNAPPABLE ------------------------------------------------ */ + SET_PROPERTY(i, EP_SNAPPABLE, (IS_DIGGABLE(i) || + IS_COLLECTIBLE(i) || + IS_SWITCHABLE(i) || + i == EL_BD_ROCK)); /* ---------- WALL ----------------------------------------------------- */ SET_PROPERTY(i, EP_WALL, TRUE); /* default: element is wall */ @@ -2347,9 +2573,12 @@ void InitElementPropertiesEngine(int engine_version) !IS_COLLECTIBLE(i))); /* ---------- DRAGONFIRE_PROOF ----------------------------------------- */ - if (IS_HISTORIC_SOLID(i) || i == EL_EXPLOSION || - (IS_CUSTOM_ELEMENT(i) && IS_INDESTRUCTIBLE(i))) + + if (IS_HISTORIC_SOLID(i) || i == EL_EXPLOSION) SET_PROPERTY(i, EP_DRAGONFIRE_PROOF, TRUE); + else + SET_PROPERTY(i, EP_DRAGONFIRE_PROOF, (IS_CUSTOM_ELEMENT(i) && + IS_INDESTRUCTIBLE(i))); /* ---------- EXPLOSION_PROOF ------------------------------------------ */ if (i == EL_FLAMES) @@ -2360,6 +2589,31 @@ void InitElementPropertiesEngine(int engine_version) SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) && !IS_WALKABLE_OVER(i) && !IS_WALKABLE_UNDER(i))); + + if (IS_CUSTOM_ELEMENT(i)) + { + /* ---------- DONT_COLLIDE_WITH / DONT_RUN_INTO ---------------------- */ + if (DONT_TOUCH(i)) + SET_PROPERTY(i, EP_DONT_COLLIDE_WITH, TRUE); + if (DONT_COLLIDE_WITH(i)) + SET_PROPERTY(i, EP_DONT_RUN_INTO, TRUE); + + /* ---------- CAN_SMASH_ENEMIES / CAN_SMASH_PLAYER ------------------- */ + if (CAN_SMASH_EVERYTHING(i)) + SET_PROPERTY(i, EP_CAN_SMASH_ENEMIES, TRUE); + if (CAN_SMASH_ENEMIES(i)) + SET_PROPERTY(i, EP_CAN_SMASH_PLAYER, TRUE); + } + + /* ---------- CAN_SMASH ------------------------------------------------ */ + SET_PROPERTY(i, EP_CAN_SMASH, (CAN_SMASH_PLAYER(i) || + CAN_SMASH_ENEMIES(i) || + CAN_SMASH_EVERYTHING(i))); + + /* ---------- CAN_EXPLODE ---------------------------------------------- */ + SET_PROPERTY(i, EP_CAN_EXPLODE, (CAN_EXPLODE_BY_FIRE(i) || + CAN_EXPLODE_SMASHED(i) || + CAN_EXPLODE_BY_FIRE(i))); } #if 0 @@ -2404,6 +2658,20 @@ void InitElementPropertiesEngine(int engine_version) (level.em_slippery_gems && engine_version > VERSION_IDENT(2,0,1))); } + + /* dynamically adjust element properties according to game engine version */ +#if 0 + if (engine_version < RELEASE_IDENT(2,2,0,7)) +#endif + { + for (i=0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + + element_info[element].push_delay_fixed = 2; + element_info[element].push_delay_random = 8; + } + } } static void InitGlobal() @@ -2537,6 +2805,16 @@ static void InitArtworkInfo() LoadArtworkInfo(); } +static char *get_string_in_brackets(char *string) +{ + char *string_in_brackets = checked_malloc(strlen(string) + 3); + + sprintf(string_in_brackets, "[%s]", string); + + return string_in_brackets; +} + +#if 0 static char *get_element_class_token(int element) { char *element_class_name = element_info[element].class_name; @@ -2547,10 +2825,21 @@ static char *get_element_class_token(int element) return element_class_token; } +static char *get_action_class_token(int action) +{ + char *action_class_name = &element_action_info[action].suffix[1]; + char *action_class_token = checked_malloc(strlen(action_class_name) + 3); + + sprintf(action_class_token, "[%s]", action_class_name); + + return action_class_token; +} +#endif + static void InitArtworkConfig() { static char *image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + 1]; - static char *sound_id_prefix[MAX_NUM_ELEMENTS + MAX_NUM_ELEMENTS + 1]; + static char *sound_id_prefix[2 * 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]; @@ -2601,8 +2890,9 @@ static void InitArtworkConfig() for (i=0; i