+#define IS_ANIMATED(g) (new_graphic_info[g].anim_frames > 1)
+
+
+/* ------------------------------------------------------------------------- */
+/* sound definitions */
+/* ------------------------------------------------------------------------- */
+
+#define SND_ACTION_UNKNOWN 0
+#define SND_ACTION_WAITING 1
+#define SND_ACTION_MOVING 2
+#define SND_ACTION_DIGGING 3
+#define SND_ACTION_COLLECTING 4
+#define SND_ACTION_PASSING 5
+#define SND_ACTION_IMPACT 6
+#define SND_ACTION_PUSHING 7
+#define SND_ACTION_ACTIVATING 8
+#define SND_ACTION_ACTIVE 9
+
+#define NUM_SND_ACTIONS 10
+
+static struct
+{
+ char *text;
+ int value;
+ boolean is_loop;
+} sound_action_properties[] =
+{
+ /* insert _all_ loop sound actions here */
+ { ".waiting", SND_ACTION_WAITING, TRUE },
+ { ".moving", SND_ACTION_MOVING, TRUE }, /* continuos moving */
+ { ".active", SND_ACTION_ACTIVE, TRUE },
+ { ".growing", SND_ACTION_UNKNOWN, TRUE },
+ { ".attacking", SND_ACTION_UNKNOWN, TRUE },
+
+ /* other (non-loop) sound actions are optional */
+ { ".stepping", SND_ACTION_MOVING, FALSE }, /* discrete moving */
+ { ".digging", SND_ACTION_DIGGING, FALSE },
+ { ".collecting", SND_ACTION_COLLECTING, FALSE },
+ { ".passing", SND_ACTION_PASSING, FALSE },
+ { ".impact", SND_ACTION_IMPACT, FALSE },
+ { ".pushing", SND_ACTION_PUSHING, FALSE },
+ { ".activating", SND_ACTION_ACTIVATING, FALSE },
+ { NULL, 0, 0 },
+};
+static int element_action_sound[MAX_NUM_ELEMENTS][NUM_SND_ACTIONS];
+static boolean is_loop_sound[NUM_SOUND_FILES];
+
+#define IS_LOOP_SOUND(x) (is_loop_sound[x])
+
+
+/* -------------------------------------------------------------------------
+ definition of elements that automatically change to other elements after
+ a specified time, eventually calling a function when changing
+ ------------------------------------------------------------------------- */
+
+/* forward declaration for changer functions */
+static void InitBuggyBase(int x, int y);
+static void WarnBuggyBase(int x, int y);
+
+static void InitTrap(int x, int y);
+static void ActivateTrap(int x, int y);
+static void ChangeActiveTrap(int x, int y);
+
+static void InitRobotWheel(int x, int y);
+static void RunRobotWheel(int x, int y);
+static void StopRobotWheel(int x, int y);
+
+static void InitTimegateWheel(int x, int y);
+static void RunTimegateWheel(int x, int y);
+
+struct ChangingElementInfo
+{
+ int base_element;
+ int next_element;
+ int change_delay;
+ void (*pre_change_function)(int x, int y);
+ void (*change_function)(int x, int y);
+ void (*post_change_function)(int x, int y);
+};
+
+static struct ChangingElementInfo changing_element_list[] =
+{
+ { EL_NUT_CRACKING, EL_EMERALD, 6, NULL, NULL, NULL },
+ { EL_PEARL_BREAKING, EL_EMPTY, 8, NULL, NULL, NULL },
+ { EL_EXIT_OPENING, EL_EXIT_OPEN, 29, NULL, NULL, NULL },
+
+ { EL_SWITCHGATE_OPENING, EL_SWITCHGATE_OPEN, 29, NULL, NULL, NULL },
+ { EL_SWITCHGATE_CLOSING, EL_SWITCHGATE_CLOSED, 29, NULL, NULL, NULL },
+
+ { EL_TIMEGATE_OPENING, EL_TIMEGATE_OPEN, 29, NULL, NULL, NULL },
+ { EL_TIMEGATE_CLOSING, EL_TIMEGATE_CLOSED, 29, NULL, NULL, NULL },
+
+ { EL_SP_BUGGY_BASE, EL_SP_BUGGY_BASE_ACTIVATING, 0,
+ InitBuggyBase, NULL, NULL },
+ { EL_SP_BUGGY_BASE_ACTIVATING,EL_SP_BUGGY_BASE_ACTIVE, 0,
+ InitBuggyBase, NULL, NULL },
+ { EL_SP_BUGGY_BASE_ACTIVE, EL_SP_BUGGY_BASE, 0,
+ InitBuggyBase, WarnBuggyBase, NULL },
+
+ { EL_TRAP, EL_TRAP_ACTIVE, 0,
+ InitTrap, NULL, ActivateTrap },
+ { EL_TRAP_ACTIVE, EL_TRAP, 32,
+ NULL, ChangeActiveTrap, NULL },
+
+ { EL_ROBOT_WHEEL_ACTIVE, EL_ROBOT_WHEEL, 0,
+ InitRobotWheel, RunRobotWheel, StopRobotWheel },
+
+ { EL_TIMEGATE_SWITCH_ACTIVE, EL_TIMEGATE_SWITCH, 0,
+ InitTimegateWheel, RunTimegateWheel, NULL },
+
+ { EL_UNDEFINED, EL_UNDEFINED, -1, NULL }
+};
+
+static struct ChangingElementInfo changing_element[MAX_NUM_ELEMENTS];
+
+#define IS_AUTO_CHANGING(e) (changing_element[e].base_element != EL_UNDEFINED)
+