gadgets_initialized = TRUE;
}
+inline void InitElementSmallImagesScaledUp(int graphic)
+{
+ CreateImageWithSmallImages(graphic, graphic_info[graphic].scale_up_factor);
+}
+
void InitElementSmallImages()
{
struct PropertyMapping *property_mapping = getImageListPropertyMapping();
/* initialize normal images from static configuration */
for (i = 0; element_to_graphic[i].element > -1; i++)
- CreateImageWithSmallImages(element_to_graphic[i].graphic);
+ InitElementSmallImagesScaledUp(element_to_graphic[i].graphic);
/* initialize special images from static configuration */
for (i = 0; element_to_special_graphic[i].element > -1; i++)
- CreateImageWithSmallImages(element_to_special_graphic[i].graphic);
+ InitElementSmallImagesScaledUp(element_to_special_graphic[i].graphic);
/* initialize images from dynamic configuration */
for (i = 0; i < num_property_mappings; i++)
if (property_mapping[i].artwork_index < MAX_NUM_ELEMENTS)
- CreateImageWithSmallImages(property_mapping[i].artwork_index);
+ InitElementSmallImagesScaledUp(property_mapping[i].artwork_index);
+
+#if 1
+ /* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */
+ for (i = IMG_EMC_OBJECT; i <= IMG_EMC_SPRITE; i++)
+ InitElementSmallImagesScaledUp(i);
+#endif
}
+#if 1
+/* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */
+void SetBitmaps_EM(Bitmap **em_bitmap)
+{
+ em_bitmap[0] = graphic_info[IMG_EMC_OBJECT].bitmap;
+ em_bitmap[1] = graphic_info[IMG_EMC_SPRITE].bitmap;
+}
+#endif
+
static int getFontBitmapID(int font_nr)
{
int special = -1;
graphic_info[graphic].crumbled_like = -1; /* do not use clone element */
graphic_info[graphic].diggable_like = -1; /* do not use clone element */
graphic_info[graphic].border_size = TILEX / 8; /* "CRUMBLED" border size */
+ graphic_info[graphic].scale_up_factor = 1; /* default: no scaling up */
graphic_info[graphic].anim_delay_fixed = 0;
graphic_info[graphic].anim_delay_random = 0;
graphic_info[graphic].post_delay_fixed = 0;
if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE)
graphic_info[graphic].height = parameter[GFX_ARG_HEIGHT];
+ /* optional zoom factor for scaling up the image to a larger size */
+ if (parameter[GFX_ARG_SCALE_UP_FACTOR] != ARG_UNDEFINED_VALUE)
+ graphic_info[graphic].scale_up_factor = parameter[GFX_ARG_SCALE_UP_FACTOR];
+ if (graphic_info[graphic].scale_up_factor < 1)
+ graphic_info[graphic].scale_up_factor = 1; /* no scaling */
+
if (src_bitmap)
{
- anim_frames_per_row = src_bitmap->width / graphic_info[graphic].width;
- anim_frames_per_col = src_bitmap->height / graphic_info[graphic].height;
+ /* bitmap is not scaled at this stage, so calculate final size */
+ int scale_up_factor = graphic_info[graphic].scale_up_factor;
+ int src_bitmap_width = src_bitmap->width * scale_up_factor;
+ int src_bitmap_height = src_bitmap->height * scale_up_factor;
+
+ anim_frames_per_row = src_bitmap_width / graphic_info[graphic].width;
+ anim_frames_per_col = src_bitmap_height / graphic_info[graphic].height;
}
/* correct x or y offset dependent of vertical or horizontal frame order */
Bitmap *src_bitmap;
int src_x, src_y;
int first_frame, last_frame;
+ int scale_up_factor, src_bitmap_width, src_bitmap_height;
#if 0
printf("::: image: '%s' [%d]\n", image->token, i);
if (graphic_info[i].bitmap == NULL)
continue; /* skip check for optional images that are undefined */
+ /* bitmap is not scaled at this stage, so calculate final size */
+ scale_up_factor = graphic_info[i].scale_up_factor;
+ src_bitmap_width = graphic_info[i].bitmap->width * scale_up_factor;
+ src_bitmap_height = graphic_info[i].bitmap->height * scale_up_factor;
+
first_frame = 0;
getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y);
if (src_x < 0 || src_y < 0 ||
- src_x + TILEX > src_bitmap->width ||
- src_y + TILEY > src_bitmap->height)
+ src_x + TILEX > src_bitmap_width ||
+ src_y + TILEY > src_bitmap_height)
{
Error(ERR_RETURN_LINE, "-");
Error(ERR_RETURN, "warning: error found in config file:");
src_x, src_y);
Error(ERR_RETURN, "custom graphic rejected for this element/action");
+#if 0
+ Error(ERR_RETURN, "scale_up_factor == %d", scale_up_factor);
+#endif
+
if (i == fallback_graphic)
Error(ERR_EXIT, "fatal error: no fallback graphic available");
last_frame = graphic_info[i].anim_frames - 1;
getGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y);
if (src_x < 0 || src_y < 0 ||
- src_x + TILEX > src_bitmap->width ||
- src_y + TILEY > src_bitmap->height)
+ src_x + TILEX > src_bitmap_width ||
+ src_y + TILEY > src_bitmap_height)
{
Error(ERR_RETURN_LINE, "-");
Error(ERR_RETURN, "warning: error found in config file:");
default_action_sound = element_info[i].sound[ACTION_DEFAULT];
#endif
+#if 1
+ /* !!! needed because EL_EMPTY_SPACE treated as IS_SP_ELEMENT !!! */
+ /* !!! make this better !!! */
+ if (i == EL_EMPTY_SPACE)
+ default_action_sound = element_info[EL_DEFAULT].sound[act];
+#endif
+
/* no sound for this specific action -- use default action sound */
if (element_info[i].sound[act] == -1)
element_info[i].sound[act] = default_action_sound;
/* explicit loop mode setting in configuration overrides default value */
if (parameter[SND_ARG_MODE_LOOP] != ARG_UNDEFINED_VALUE)
sound_info[sound].loop = parameter[SND_ARG_MODE_LOOP];
+
+ /* sound volume to change the original volume when loading the sound file */
+ sound_info[sound].volume = parameter[SND_ARG_VOLUME];
+
+ /* sound priority to give certain sounds a higher or lower priority */
+ sound_info[sound].volume = parameter[SND_ARG_VOLUME];
}
static void InitSoundInfo()
InitElementGraphicInfo(); /* element game graphic mapping */
InitElementSpecialGraphicInfo(); /* element special graphic mapping */
- InitElementSmallImages(); /* create editor and preview images */
+ InitElementSmallImages(); /* scale images to all needed sizes */
InitFontGraphicInfo(); /* initialize text drawing functions */
SetMainBackgroundImage(IMG_BACKGROUND);
EL_TRAP,
EL_INVISIBLE_SAND,
EL_INVISIBLE_SAND_ACTIVE,
+ EL_EMC_GRASS,
/* !!! currently not diggable, but handled by 'ep_dont_run_into' !!! */
/* (if amoeba can grow into anything diggable, maybe keep these out) */
EL_LANDMINE,
EL_TRAP_ACTIVE,
EL_SP_BUGGY_BASE_ACTIVE,
+ EL_EMC_PLANT,
#endif
-1
};
EL_EM_KEY_2,
EL_EM_KEY_3,
EL_EM_KEY_4,
+ EL_EM_KEY_5,
+ EL_EM_KEY_6,
+ EL_EM_KEY_7,
+ EL_EM_KEY_8,
EL_DYNAMITE,
EL_DYNABOMB_INCREASE_NUMBER,
EL_DYNABOMB_INCREASE_SIZE,
EL_ENVELOPE_3,
EL_ENVELOPE_4,
EL_SPEED_PILL,
+ EL_EMC_LENSES,
+ EL_EMC_MAGNIFIER,
-1
};
EL_LANDMINE,
EL_TRAP_ACTIVE,
EL_SP_BUGGY_BASE_ACTIVE,
+ EL_EMC_PLANT,
#endif
-1
};
EL_STEELWALL_SLIPPERY,
EL_PEARL,
EL_CRYSTAL,
+ EL_EMC_WALL_SLIPPERY_1,
+ EL_EMC_WALL_SLIPPERY_2,
+ EL_EMC_WALL_SLIPPERY_3,
+ EL_EMC_WALL_SLIPPERY_4,
-1
};
EL_SP_ELECTRON,
EL_BALLOON,
EL_SPRING,
+ EL_EMC_ANDROID,
-1
};
EL_EM_GATE_2,
EL_EM_GATE_3,
EL_EM_GATE_4,
+ EL_EM_GATE_5,
+ EL_EM_GATE_6,
+ EL_EM_GATE_7,
+ EL_EM_GATE_8,
EL_EM_GATE_1_GRAY,
EL_EM_GATE_2_GRAY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
+ EL_EM_GATE_5_GRAY,
+ EL_EM_GATE_6_GRAY,
+ EL_EM_GATE_7_GRAY,
+ EL_EM_GATE_8_GRAY,
EL_SWITCHGATE_OPEN,
EL_TIMEGATE_OPEN,
-1
EL_SATELLITE,
EL_SP_DISK_YELLOW,
EL_BALLOON,
+ EL_EMC_ANDROID,
-1
};
EL_EM_GATE_2,
EL_EM_GATE_3,
EL_EM_GATE_4,
+ EL_EM_GATE_5,
+ EL_EM_GATE_6,
+ EL_EM_GATE_7,
+ EL_EM_GATE_8,
EL_EM_GATE_1_GRAY,
EL_EM_GATE_2_GRAY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
+ EL_EM_GATE_5_GRAY,
+ EL_EM_GATE_6_GRAY,
+ EL_EM_GATE_7_GRAY,
+ EL_EM_GATE_8_GRAY,
EL_SWITCHGATE_OPEN,
EL_TIMEGATE_OPEN,
EL_SP_GRAVITY_OFF_PORT_RIGHT,
EL_SP_GRAVITY_OFF_PORT_UP,
EL_SP_GRAVITY_OFF_PORT_DOWN,
+ EL_EMC_GRASS,
-1
};
EL_BALLOON_SWITCH_ANY,
EL_LAMP,
EL_TIME_ORB_FULL,
+ EL_EMC_MAGIC_BALL_SWITCH,
-1
};
EL_EM_GATE_2,
EL_EM_GATE_3,
EL_EM_GATE_4,
+ EL_EM_GATE_5,
+ EL_EM_GATE_6,
+ EL_EM_GATE_7,
+ EL_EM_GATE_8,
EL_EM_GATE_1_GRAY,
EL_EM_GATE_2_GRAY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
+ EL_EM_GATE_5_GRAY,
+ EL_EM_GATE_6_GRAY,
+ EL_EM_GATE_7_GRAY,
+ EL_EM_GATE_8_GRAY,
-1
};
EL_EM_KEY_2,
EL_EM_KEY_3,
EL_EM_KEY_4,
+ EL_EM_KEY_5,
+ EL_EM_KEY_6,
+ EL_EM_KEY_7,
+ EL_EM_KEY_8,
EL_GATE_1,
EL_GATE_2,
EL_GATE_3,
EL_EM_GATE_2,
EL_EM_GATE_3,
EL_EM_GATE_4,
+ EL_EM_GATE_5,
+ EL_EM_GATE_6,
+ EL_EM_GATE_7,
+ EL_EM_GATE_8,
EL_EM_GATE_1_GRAY,
EL_EM_GATE_2_GRAY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
+ EL_EM_GATE_5_GRAY,
+ EL_EM_GATE_6_GRAY,
+ EL_EM_GATE_7_GRAY,
+ EL_EM_GATE_8_GRAY,
EL_DYNAMITE,
EL_INVISIBLE_STEELWALL,
EL_INVISIBLE_WALL,
EL_EMC_STEELWALL_2,
EL_EMC_STEELWALL_3,
EL_EMC_STEELWALL_4,
+ EL_EMC_WALL_SLIPPERY_1,
+ EL_EMC_WALL_SLIPPERY_2,
+ EL_EMC_WALL_SLIPPERY_3,
+ EL_EMC_WALL_SLIPPERY_4,
EL_EMC_WALL_1,
EL_EMC_WALL_2,
EL_EMC_WALL_3,
EL_EMC_WALL_6,
EL_EMC_WALL_7,
EL_EMC_WALL_8,
+ EL_EMC_WALL_9,
+ EL_EMC_WALL_10,
+ EL_EMC_WALL_11,
+ EL_EMC_WALL_12,
+ EL_EMC_WALL_13,
+ EL_EMC_WALL_14,
+ EL_EMC_WALL_15,
+ EL_EMC_WALL_16,
-1
};
for (i = 0; i < MAX_NUM_ELEMENTS + 1; i++)
{
+ /* check if element_name_info entry defined for each element in "main.h" */
+ if (i < MAX_NUM_ELEMENTS && element_name_info[i].token_name == NULL)
+ Error(ERR_EXIT, "undefined 'element_name_info' entry for element %d", i);
+
element_info[i].token_name = element_name_info[i].token_name;
element_info[i].class_name = element_name_info[i].class_name;
element_info[i].editor_description=element_name_info[i].editor_description;
game_status = GAME_MODE_MAIN;
- DrawMainMenu();
-
- InitNetworkServer();
-
#if 1
em_open_all();
#endif
+ DrawMainMenu();
+
+ InitNetworkServer();
}
void CloseAllAndExit(int exit_value)
{
-
-#if 1
- em_close_all();
-#endif
-
StopSounds();
FreeAllSounds();
FreeAllMusic();
CloseAudio(); /* called after freeing sounds (needed for SDL) */
+#if 1
+ em_close_all();
+#endif
+
FreeAllImages();
FreeTileClipmasks();