-/* macros for base properties */
-#define IS_AMOEBALIVE(e) HAS_PROPERTY(e, EP_AMOEBALIVE)
-#define IS_AMOEBOID(e) HAS_PROPERTY(e, EP_AMOEBOID)
-#define CAN_BE_CRUMBLED(e) HAS_PROPERTY(e, EP_CAN_BE_CRUMBLED)
-#define IS_PFORTE(e) HAS_PROPERTY(e, EP_PFORTE)
-#define IS_SOLID(e) HAS_PROPERTY(e, EP_SOLID)
+
+/* values for change events for custom elements */
+#define CE_DELAY 0
+#define CE_TOUCHED_BY_PLAYER 1
+#define CE_PRESSED_BY_PLAYER 2
+#define CE_PUSHED_BY_PLAYER 3
+#define CE_COLLISION 4
+#define CE_IMPACT 5
+#define CE_SMASHED 6
+#define CE_OTHER_IS_TOUCHING 7
+#define CE_OTHER_IS_CHANGING 8
+#define CE_OTHER_IS_EXPLODING 9
+#define CE_OTHER_GETS_TOUCHED 10
+#define CE_OTHER_GETS_PRESSED 11
+#define CE_OTHER_GETS_PUSHED 12
+#define CE_OTHER_GETS_COLLECTED 13
+
+/* values for internal purpose only (level editor) */
+#define CE_BY_PLAYER 14
+#define CE_BY_COLLISION 15
+#define CE_BY_OTHER 16
+
+#define NUM_CHANGE_EVENTS 17
+
+#define CE_BITMASK_DEFAULT 0
+
+#define CH_EVENT_BIT(c) (1 << (c))
+#define CH_EVENT_VAR(e) (element_info[e].change.events)
+
+#define HAS_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \
+ (CH_EVENT_VAR(e) & CH_EVENT_BIT(c)) != 0)
+#define SET_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \
+ ((v) ? \
+ (CH_EVENT_VAR(e) |= CH_EVENT_BIT(c)) : \
+ (CH_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0)
+
+/* values for change power for custom elements */
+#define CP_NON_DESTRUCTIVE 0
+#define CP_HALF_DESTRUCTIVE 1
+#define CP_FULL_DESTRUCTIVE 2
+
+
+/* macros for configurable properties */
+#define IS_DIGGABLE(e) HAS_PROPERTY(e, EP_DIGGABLE)
+#define IS_COLLECTIBLE(e) HAS_PROPERTY(e, EP_COLLECTIBLE)
+#define DONT_RUN_INTO(e) HAS_PROPERTY(e, EP_DONT_RUN_INTO)
+#define DONT_COLLIDE_WITH(e) HAS_PROPERTY(e, EP_DONT_COLLIDE_WITH)
+#define DONT_TOUCH(e) HAS_PROPERTY(e, EP_DONT_TOUCH)