+#endif
+
+ /* set temporary graphics action field to default value */
+ for (i=0; i<NUM_IMAGE_FILES; i++)
+ gfx_action[i] = GFX_ACTION_DEFAULT;
+
+ /* set temporary graphics action field from element_to_graphic list */
+ i = 0;
+ while (element_to_graphic[i].element > -1)
+ {
+ int action = element_to_graphic[i].action;
+ int graphic = element_to_graphic[i].graphic;
+
+ if (action == -1)
+ action = GFX_ACTION_DEFAULT;
+
+ gfx_action[graphic] = action;
+
+ i++;
+ }
+
+ for (i=0; i<NUM_IMAGE_FILES; i++)
+ {
+ int *parameter = image_files[i].parameter;
+
+ new_graphic_info[i].bitmap = getBitmapFromImageID(i);
+
+ new_graphic_info[i].src_x = parameter[GFX_ARG_XPOS] * TILEX;
+ new_graphic_info[i].src_y = parameter[GFX_ARG_YPOS] * TILEY;
+ new_graphic_info[i].offset_x = parameter[GFX_ARG_OFFSET];
+ new_graphic_info[i].offset_y = 0;
+
+ /* animation frames are ordered vertically instead of horizontally */
+ if (parameter[GFX_ARG_VERTICAL])
+ {
+ new_graphic_info[i].offset_x = 0;
+ new_graphic_info[i].offset_y = parameter[GFX_ARG_OFFSET];
+ }
+
+ new_graphic_info[i].anim_frames = parameter[GFX_ARG_FRAMES];
+
+ new_graphic_info[i].anim_delay = parameter[GFX_ARG_DELAY];
+ if (new_graphic_info[i].anim_delay == 0) /* delay must be at least 1 */
+ new_graphic_info[i].anim_delay = 1;
+
+ /* set mode for animation frame order */
+ if (parameter[GFX_ARG_MODE_LOOP])
+ new_graphic_info[i].anim_mode = ANIM_LOOP;
+ else if (parameter[GFX_ARG_MODE_LINEAR])
+ new_graphic_info[i].anim_mode = ANIM_LINEAR;
+ else if (parameter[GFX_ARG_MODE_PINGPONG])
+ new_graphic_info[i].anim_mode = ANIM_PINGPONG;
+ else if (parameter[GFX_ARG_MODE_PINGPONG2])
+ new_graphic_info[i].anim_mode = ANIM_PINGPONG2;
+ else if (parameter[GFX_ARG_FRAMES] > 1)
+ new_graphic_info[i].anim_mode = ANIM_LOOP;
+ else
+ new_graphic_info[i].anim_mode = ANIM_NONE;
+
+ /* set additional flag to play animation frames in reverse order */
+ if (parameter[GFX_ARG_MODE_REVERSE])
+ new_graphic_info[i].anim_mode |= ANIM_REVERSE;
+
+#if 1
+ /* set first frame of animation after determining animation mode */
+ new_graphic_info[i].anim_start_frame = parameter[GFX_ARG_START_FRAME];
+ if (new_graphic_info[i].anim_start_frame == -1)
+ new_graphic_info[i].anim_start_frame = 0;
+ else if (new_graphic_info[i].anim_mode & ANIM_REVERSE)
+ new_graphic_info[i].anim_start_frame =
+ new_graphic_info[i].anim_frames
+ - new_graphic_info[i].anim_start_frame - 1;
+#else
+ /* set first frame of animation after determining animation mode */
+ new_graphic_info[i].anim_start_frame = parameter[GFX_ARG_START_FRAME];
+ if (parameter[GFX_ARG_START_FRAME] == -1) /* default: start with ... */
+ {
+ if (parameter[GFX_ARG_MODE_REVERSE])
+ new_graphic_info[i].anim_start_frame =
+ new_graphic_info[i].anim_frames - 1; /* ... last frame */
+ else
+ new_graphic_info[i].anim_start_frame = 0; /* ... first frame */
+ }
+#endif
+
+#if 1
+ /* animation synchronized with global frame counter, not move position */
+ new_graphic_info[i].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC];
+ if (parameter[GFX_ARG_GLOBAL_SYNC] == -1)
+ new_graphic_info[i].anim_global_sync =
+ (gfx_action[i] == GFX_ACTION_DEFAULT ? TRUE : FALSE);
+#else
+ /* animation synchronized with global frame counter, not move position */
+ new_graphic_info[i].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC];
+#endif
+
+ /* now check if the loaded image is large enough for the animation */
+ last_frame = new_graphic_info[i].anim_frames - 1;
+
+ getGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y);
+ if (src_x + TILEX > src_bitmap->width ||
+ src_y + TILEY > src_bitmap->height)
+ Error(ERR_EXIT, "InitGraphicInfo: image bitmap '%s' too small for graphic object %d (normal size)", src_bitmap->source_filename, i);
+
+ getMiniGraphicSource(i, &src_bitmap, &src_x, &src_y);
+ if (src_x + MINI_TILEX > src_bitmap->width ||
+ src_y + MINI_TILEY > src_bitmap->height)
+ Error(ERR_EXIT, "InitGraphicInfo: image bitmap '%s' too small for graphic object %d ('mini' size)", src_bitmap->source_filename, i);
+
+ getMicroGraphicSource(i, &src_bitmap, &src_x, &src_y);
+ if (src_x + MICRO_TILEX > src_bitmap->width ||
+ src_y + MICRO_TILEY > src_bitmap->height)
+ Error(ERR_EXIT, "InitGraphicInfo: image bitmap '%s' too small for graphic object %d ('micro' size)", src_bitmap->source_filename, i);
+
+
+#if 0
+ {
+ int j;
+
+ if (i == IMG_EMERALD)
+ {
+ for (j=0; j<NUM_GFX_ARGS; j++)
+ printf("%s -> %d\n", image_config_suffix[j].token, parameter[j]);
+ printf("-> %d\n", new_graphic_info[i].anim_frames);
+ printf("\n");
+ }
+ }
+#endif
+
+ }
+
+
+#if 0
+ printf("D> %d\n", image_files[GFX_BD_DIAMOND].parameter[GFX_ARG_NUM_FRAMES]);
+ printf("W> %d\n", image_files[GFX_ROBOT_WHEEL].parameter[GFX_ARG_NUM_FRAMES]);
+
+ graphic_info[GFX_ABLENK].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL);
+ graphic_info[GFX_ABLENK].src_x = 0;
+ graphic_info[GFX_ABLENK].src_y = 0;
+
+ graphic_info[GFX_ABLENK + 1].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL);
+ graphic_info[GFX_ABLENK + 2].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL);
+ graphic_info[GFX_ABLENK + 3].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL);
+ graphic_info[GFX_ABLENK + 1].src_x = 1 * TILEX;
+ graphic_info[GFX_ABLENK + 2].src_x = 2 * TILEX;
+ graphic_info[GFX_ABLENK + 3].src_x = 3 * TILEX;
+ graphic_info[GFX_ABLENK + 1].src_y = 0;
+ graphic_info[GFX_ABLENK + 2].src_y = 0;
+ graphic_info[GFX_ABLENK + 3].src_y = 0;
+#endif
+}
+
+static void InitSoundInfo()
+{
+ sound_files = getCurrentSoundList();
+
+ /* initialize sound effect lookup table for element actions */
+ InitGameSound();