+void TestIfPlayerTouchesCustomElement(int x, int y)
+{
+#if 0
+ static boolean check_changing = FALSE;
+#endif
+ static int xy[4][2] =
+ {
+ { 0, -1 },
+ { -1, 0 },
+ { +1, 0 },
+ { 0, +1 }
+ };
+ int i;
+
+#if 0
+ if (check_changing) /* prevent this function from running into a loop */
+ return;
+
+ check_changing = TRUE;
+#endif
+
+ for (i=0; i<4; i++)
+ {
+ int xx = x + xy[i][0];
+ int yy = y + xy[i][1];
+
+ if (!IN_LEV_FIELD(xx, yy))
+ continue;
+
+ if (IS_PLAYER(x, y))
+ {
+ CheckTriggeredElementChange(xx, yy, Feld[xx][yy], CE_OTHER_GETS_TOUCHED);
+ CheckElementChange(xx, yy, Feld[xx][yy], CE_TOUCHED_BY_PLAYER);
+ }
+ else if (IS_PLAYER(xx, yy))
+ {
+ CheckTriggeredElementChange(x, y, Feld[x][y], CE_OTHER_GETS_TOUCHED);
+ CheckElementChange(x, y, Feld[x][y], CE_TOUCHED_BY_PLAYER);
+
+ break;
+ }
+ }
+
+#if 0
+ check_changing = FALSE;
+#endif
+}
+
+void TestIfElementTouchesCustomElement(int x, int y)
+{
+#if 0
+ static boolean check_changing = FALSE;
+#endif
+ static int xy[4][2] =
+ {
+ { 0, -1 },
+ { -1, 0 },
+ { +1, 0 },
+ { 0, +1 }
+ };
+ static int touching_side[4][2] =
+ {
+ { CE_TOUCHING_TOP_OF, CE_TOUCHING_BOTTOM_OF },
+ { CE_TOUCHING_LEFT_OF, CE_TOUCHING_RIGHT_OF },
+ { CE_TOUCHING_RIGHT_OF, CE_TOUCHING_LEFT_OF },
+ { CE_TOUCHING_BOTTOM_OF, CE_TOUCHING_TOP_OF }
+ };
+ boolean change_center_element = FALSE;
+ int center_element_change_page = 0;
+ int center_element_change_event = 0;
+ int center_element = Feld[x][y];
+ int i, j;
+
+#if 0
+ if (check_changing) /* prevent this function from running into a loop */
+ return;
+
+ check_changing = TRUE;
+#endif
+
+ for (i=0; i<4; i++)
+ {
+ int xx = x + xy[i][0];
+ int yy = y + xy[i][1];
+ int change_event_center = touching_side[i][0];
+ int change_event_border = touching_side[i][1];
+ int border_element;
+
+ if (!IN_LEV_FIELD(xx, yy))
+ continue;
+
+ border_element = Feld[xx][yy];
+
+ /* check for change of center element (but change it only once) */
+ if (IS_CUSTOM_ELEMENT(center_element) &&
+ HAS_ANY_CHANGE_EVENT(center_element, change_event_border) &&
+ !change_center_element)
+ {
+ for (j=0; j < element_info[center_element].num_change_pages; j++)
+ {
+ struct ElementChangeInfo *change =
+ &element_info[center_element].change_page[j];
+
+ if (change->events & CH_EVENT_BIT(change_event_border) &&
+ change->trigger_element == border_element)
+ {
+ change_center_element = TRUE;
+ center_element_change_page = j;
+ center_element_change_event = change_event_border;
+
+ break;
+ }
+ }
+ }
+
+ /* check for change of border element */
+ if (IS_CUSTOM_ELEMENT(border_element) &&
+ HAS_ANY_CHANGE_EVENT(border_element, change_event_center))
+ {
+ for (j=0; j < element_info[border_element].num_change_pages; j++)
+ {
+ struct ElementChangeInfo *change =
+ &element_info[border_element].change_page[j];
+
+ if (change->events & CH_EVENT_BIT(change_event_center) &&
+ change->trigger_element == center_element)
+ {
+ CheckElementChangeExt(xx,yy, border_element, change_event_center, j);
+ break;
+ }
+ }
+ }
+ }
+
+ if (change_center_element)
+ CheckElementChangeExt(x, y, center_element, center_element_change_event,
+ center_element_change_page);
+
+#if 0
+ check_changing = FALSE;
+#endif
+}
+