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++)
{
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)
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));
if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].sound[act] != -1)
default_action_sound = element_info[EL_SB_DEFAULT].sound[act];
+ /* !!! there's no such thing as a "default action sound" !!! */
+#if 0
/* look for element specific default sound (independent from action) */
if (element_info[i].sound[ACTION_DEFAULT] != -1)
default_action_sound = element_info[i].sound[ACTION_DEFAULT];
+#endif
/* no sound for this specific action -- use default action sound */
if (element_info[i].sound[act] == -1)
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));
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));
EL_SP_ELECTRON,
EL_BALLOON,
EL_SPRING,
- EL_MAZE_RUNNER,
-1
};
-1
};
+ static int ep_can_explode_dyna[] =
+ {
+ -1
+ };
+
static int ep_player[] =
{
EL_PLAYER_1,
{ 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_player, EP_PLAYER },
{ ep_can_pass_magic_wall, EP_CAN_PASS_MAGIC_WALL },
/* ---------- 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)));
+#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 */
element_info[element].push_delay_random = game.default_push_delay_random;
}
#endif
+
+ /* this is needed because some graphics depend on element properties */
+ InitElementGraphicInfo();
}
static void InitGlobal()
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",
redraw_screen = TRUE;
}
- if (snd_new_identifier != NULL)
+ if (snd_new_identifier != NULL || force_reload_snd)
{
ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
redraw_screen = TRUE;
}
- if (mus_new_identifier != NULL)
+ if (mus_new_identifier != NULL || force_reload_mus)
{
ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);