X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=a7bb5979831043fc3de891b4317283c2601ece35;hb=4d331e6a8db3d4b6f1006a70a0fad6f02323c9b9;hp=104aef40ac734df328fc5a9a4bb62af4400ba255;hpb=aca666256c715771b11d3277e10ff971aea44af8;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 104aef40..a7bb5979 100644 --- a/src/init.c +++ b/src/init.c @@ -413,6 +413,9 @@ void InitElementGraphicInfo() int num_property_mappings = getImageListPropertyMappingSize(); int i, act, dir; + if (graphic_info == NULL) /* still at startup phase */ + return; + /* set values to -1 to identify later as "uninitialized" values */ for (i = 0; i < MAX_NUM_ELEMENTS; i++) { @@ -595,7 +598,7 @@ void InitElementGraphicInfo() int default_direction_crumbled[NUM_DIRECTIONS]; if (default_graphic == -1) - default_graphic = IMG_CHAR_QUESTION; + default_graphic = IMG_UNKNOWN; if (default_crumbled == -1) default_crumbled = IMG_EMPTY; @@ -641,6 +644,15 @@ void InitElementGraphicInfo() if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].crumbled[act] != -1) default_action_crumbled = element_info[EL_SB_DEFAULT].crumbled[act]; +#if 1 + /* !!! make this better !!! */ + if (i == EL_EMPTY_SPACE) + { + default_action_graphic = element_info[EL_DEFAULT].graphic[act]; + default_action_crumbled = element_info[EL_DEFAULT].crumbled[act]; + } +#endif + if (default_action_graphic == -1) default_action_graphic = default_graphic; if (default_action_crumbled == -1) @@ -720,8 +732,8 @@ void InitElementGraphicInfo() if (options.verbose) { for (i = 0; i < MAX_NUM_ELEMENTS; i++) - if (element_info[i].graphic[ACTION_DEFAULT] == IMG_CHAR_QUESTION && - i != EL_CHAR_QUESTION) + if (element_info[i].graphic[ACTION_DEFAULT] == IMG_UNKNOWN && + i != EL_UNKNOWN) Error(ERR_RETURN, "warning: no graphic for element '%s' (%d)", element_info[i].token_name, i); } @@ -967,8 +979,7 @@ static void InitGraphicInfo() GC copy_clipmask_gc = None; #endif - if (graphic_info != NULL) - free(graphic_info); + checked_free(graphic_info); graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo)); @@ -1265,8 +1276,7 @@ static void InitSoundInfo() int num_sounds = getSoundListSize(); int i, j; - if (sound_info != NULL) - free(sound_info); + checked_free(sound_info); sound_effect_properties = checked_calloc(num_sounds * sizeof(int)); sound_info = checked_calloc(num_sounds * sizeof(struct SoundInfo)); @@ -1497,8 +1507,7 @@ static void InitMusicInfo() int num_music = getMusicListSize(); int i, j; - if (music_info != NULL) - free(music_info); + checked_free(music_info); music_info = checked_calloc(num_music * sizeof(struct MusicInfo)); @@ -1834,7 +1843,6 @@ void InitElementPropertiesStatic() EL_SP_ELECTRON, EL_BALLOON, EL_SPRING, - EL_MAZE_RUNNER, -1 }; @@ -1937,6 +1945,9 @@ void InitElementPropertiesStatic() EL_SP_DISK_YELLOW, EL_SP_SNIKSNAK, EL_SP_ELECTRON, +#if 0 + EL_BLACK_ORB, +#endif -1 }; @@ -2071,6 +2082,26 @@ void InitElementPropertiesStatic() -1 }; + static int ep_can_explode_dyna[] = + { + -1 + }; + + static int ep_protected[] = + { + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1_GRAY, + EL_EM_GATE_2_GRAY, + EL_EM_GATE_3_GRAY, + EL_EM_GATE_4_GRAY, + EL_SWITCHGATE_OPEN, + EL_TIMEGATE_OPEN, + -1 + }; + static int ep_player[] = { EL_PLAYER_1, @@ -2151,6 +2182,7 @@ void InitElementPropertiesStatic() EL_BD_BUTTERFLY_4, EL_BD_AMOEBA, EL_CHAR_QUESTION, + EL_UNKNOWN, -1 }; @@ -2842,6 +2874,8 @@ void InitElementPropertiesStatic() { ep_droppable, EP_DROPPABLE }, { ep_can_explode_1x1, EP_CAN_EXPLODE_1X1 }, { ep_pushable, EP_PUSHABLE }, + { ep_can_explode_dyna, EP_CAN_EXPLODE_DYNA }, + { ep_protected, EP_PROTECTED }, { ep_player, EP_PLAYER }, { ep_can_pass_magic_wall, EP_CAN_PASS_MAGIC_WALL }, @@ -3058,6 +3092,10 @@ void InitElementPropertiesEngine(int engine_version) !IS_DIGGABLE(i) && !IS_COLLECTIBLE(i))); + /* ---------- PROTECTED ------------------------------------------------ */ + if (IS_ACCESSIBLE_INSIDE(i)) + SET_PROPERTY(i, EP_PROTECTED, TRUE); + /* ---------- DRAGONFIRE_PROOF ----------------------------------------- */ if (IS_HISTORIC_SOLID(i) || i == EL_EXPLOSION) @@ -3072,9 +3110,20 @@ void InitElementPropertiesEngine(int engine_version) else if (engine_version < VERSION_IDENT(2,2,0,0)) SET_PROPERTY(i, EP_EXPLOSION_PROOF, IS_INDESTRUCTIBLE(i)); else +#if 1 + SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) && + (!IS_WALKABLE(i) || + IS_PROTECTED(i)))); +#else +#if 1 SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) && !IS_WALKABLE_OVER(i) && !IS_WALKABLE_UNDER(i))); +#else + SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) && + IS_PROTECTED(i))); +#endif +#endif if (IS_CUSTOM_ELEMENT(i)) { @@ -3103,7 +3152,28 @@ void InitElementPropertiesEngine(int engine_version) /* ---------- CAN_EXPLODE_3X3 ------------------------------------------ */ SET_PROPERTY(i, EP_CAN_EXPLODE_3X3, (CAN_EXPLODE(i) && - !CAN_EXPLODE_1X1(i))); + !CAN_EXPLODE_1X1(i) && + !CAN_EXPLODE_DYNA(i))); + + /* ---------- CAN_EXPLODE_BY_DRAGONFIRE -------------------------------- */ + SET_PROPERTY(i, EP_CAN_EXPLODE_BY_DRAGONFIRE, CAN_EXPLODE_BY_FIRE(i)); + + /* ---------- CAN_EXPLODE_BY_EXPLOSION --------------------------------- */ + SET_PROPERTY(i, EP_CAN_EXPLODE_BY_EXPLOSION, (CAN_EXPLODE_BY_FIRE(i) || + i == EL_BLACK_ORB)); + + /* ---------- SP_PORT -------------------------------------------------- */ + SET_PROPERTY(i, EP_SP_PORT, (IS_SP_ELEMENT(i) && + IS_PASSABLE_INSIDE(i))); + +#if 0 + if (i == EL_CUSTOM_START + 253) + printf("::: %d, %d, %d -> %d\n", + CAN_EXPLODE_1X1(i), + CAN_EXPLODE_3X3(i), + CAN_EXPLODE_DYNA(i), + CAN_EXPLODE(i)); +#endif /* ---------- CAN_CHANGE ----------------------------------------------- */ SET_PROPERTY(i, EP_CAN_CHANGE, FALSE); /* default: cannot change */ @@ -3182,7 +3252,25 @@ void InitElementPropertiesEngine(int engine_version) if (element_info[element].push_delay_random == -1) element_info[element].push_delay_random = game.default_push_delay_random; } + + /* set some other uninitialized values of custom elements in older levels */ + if (engine_version < VERSION_IDENT(3,0,9,0)) + { + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + + element_info[element].access_direction = MV_ALL_DIRECTIONS; + + element_info[element].explosion_delay = 18; + element_info[element].ignition_delay = 8; + } + } #endif + + /* this is needed because some graphics depend on element properties */ + if (game_status == GAME_MODE_PLAYING) + InitElementGraphicInfo(); } static void InitGlobal() @@ -3798,14 +3886,17 @@ static char *getNewArtworkIdentifier(int type) return artwork_new_identifier; } -void ReloadCustomArtwork() +void ReloadCustomArtwork(int force_reload) { char *gfx_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_GRAPHICS); char *snd_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_SOUNDS); char *mus_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_MUSIC); + boolean force_reload_gfx = (force_reload & (1 << ARTWORK_TYPE_GRAPHICS)); + boolean force_reload_snd = (force_reload & (1 << ARTWORK_TYPE_SOUNDS)); + boolean force_reload_mus = (force_reload & (1 << ARTWORK_TYPE_MUSIC)); boolean redraw_screen = FALSE; - if (gfx_new_identifier != NULL) + if (gfx_new_identifier != NULL || force_reload_gfx) { #if 0 printf("RELOADING GRAPHICS '%s' -> '%s' ['%s', '%s']\n", @@ -3830,7 +3921,7 @@ void ReloadCustomArtwork() redraw_screen = TRUE; } - if (snd_new_identifier != NULL) + if (snd_new_identifier != NULL || force_reload_snd) { ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); @@ -3839,7 +3930,7 @@ void ReloadCustomArtwork() redraw_screen = TRUE; } - if (mus_new_identifier != NULL) + if (mus_new_identifier != NULL || force_reload_mus) { ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);