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 */
if (parameter[GFX_ARG_BORDER_SIZE] != ARG_UNDEFINED_VALUE)
graphic_info[graphic].border_size = parameter[GFX_ARG_BORDER_SIZE];
- /* optional zoom factor for scaling up the image to a larger size */
- if (parameter[GFX_ARG_SCALE_UP] != ARG_UNDEFINED_VALUE)
- graphic_info[graphic].scale_up_factor = parameter[GFX_ARG_SCALE_UP];
- if (graphic_info[graphic].scale_up_factor < 1)
- graphic_info[graphic].scale_up_factor = 1; /* no scaling */
-
/* this is only used for player "boring" and "sleeping" actions */
if (parameter[GFX_ARG_ANIM_DELAY_FIXED] != ARG_UNDEFINED_VALUE)
graphic_info[graphic].anim_delay_fixed =
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;