+static void DrawEditModeWindow()
+{
+ ModifyEditorElementList();
+ RedrawDrawingElements();
+
+ if (edit_mode == ED_MODE_INFO)
+ DrawLevelInfoWindow();
+ else if (edit_mode == ED_MODE_PROPERTIES)
+ DrawPropertiesWindow();
+ else /* edit_mode == ED_MODE_DRAWING */
+ DrawDrawingWindow();
+}
+
+static boolean LevelChanged()
+{
+ boolean level_changed = FALSE;
+ int x, y;
+
+ for (y = 0; y < lev_fieldy; y++)
+ for (x = 0; x < lev_fieldx; x++)
+ if (Feld[x][y] != level.field[x][y])
+ level_changed = TRUE;
+
+ return level_changed;
+}
+
+static boolean LevelContainsPlayer()
+{
+ boolean player_found = FALSE;
+ int x, y;
+
+ for (y = 0; y < lev_fieldy; y++)
+ for (x = 0; x < lev_fieldx; x++)
+ if (Feld[x][y] == EL_PLAYER_1 ||
+ Feld[x][y] == EL_SP_MURPHY)
+ player_found = TRUE;
+
+ return player_found;
+}
+
+static void CopyPlayfield(short src[MAX_LEV_FIELDX][MAX_LEV_FIELDY],
+ short dst[MAX_LEV_FIELDX][MAX_LEV_FIELDY])
+{
+ int x, y;
+
+ for (x = 0; x < lev_fieldx; x++)
+ for (y = 0; y < lev_fieldy; y++)
+ dst[x][y] = src[x][y];
+}
+
+static int setSelectboxValue(int selectbox_id, int new_value)
+{
+ int new_index_value = 0;
+ int i;
+
+ for (i = 0; selectbox_info[selectbox_id].options[i].text != NULL; i++)
+ if (selectbox_info[selectbox_id].options[i].value == new_value)
+ new_index_value = i;
+
+ *selectbox_info[selectbox_id].value =
+ selectbox_info[selectbox_id].options[new_index_value].value;
+
+ return new_index_value;
+}
+
+static void copy_custom_element_settings(int element_from, int element_to)
+{
+ struct ElementInfo *ei_from = &element_info[element_from];
+ struct ElementInfo *ei_to = &element_info[element_to];
+ int i, x, y;
+
+ /* ---------- copy element description ---------- */
+ for (i = 0; i < MAX_ELEMENT_NAME_LEN + 1; i++)
+ ei_to->description[i] = ei_from->description[i];
+
+ /* ---------- copy element properties ---------- */
+ Properties[element_to][EP_BITFIELD_BASE] =
+ Properties[element_from][EP_BITFIELD_BASE];
+
+ /* ---------- copy custom property values ---------- */
+
+ ei_to->use_gfx_element = ei_from->use_gfx_element;
+ ei_to->gfx_element = ei_from->gfx_element;
+
+ ei_to->collect_score = ei_from->collect_score;
+ ei_to->collect_count = ei_from->collect_count;
+
+ ei_to->push_delay_fixed = ei_from->push_delay_fixed;
+ ei_to->push_delay_random = ei_from->push_delay_random;
+ ei_to->move_delay_fixed = ei_from->move_delay_fixed;
+ ei_to->move_delay_random = ei_from->move_delay_random;
+
+ ei_to->move_pattern = ei_from->move_pattern;
+ ei_to->move_direction_initial = ei_from->move_direction_initial;
+ ei_to->move_stepsize = ei_from->move_stepsize;
+
+ ei_to->slippery_type = ei_from->slippery_type;
+
+ for (y = 0; y < 3; y++)
+ for (x = 0; x < 3; x++)
+ ei_to->content[x][y] = ei_from->content[x][y];
+
+ ei_to->num_change_pages = ei_from->num_change_pages;
+ setElementChangePages(ei_to, ei_to->num_change_pages);
+
+ for (i=0; i < ei_to->num_change_pages; i++)
+ {
+ struct ElementChangeInfo *change_to = &ei_to->change_page[i];
+ struct ElementChangeInfo *change_from = &ei_from->change_page[i];
+
+ /* always start with reliable default values */
+ setElementChangeInfoToDefaults(change_to);
+
+ change_to->events = change_from->events;
+
+ change_to->target_element = change_from->target_element;
+
+ change_to->delay_fixed = change_from->delay_fixed;
+ change_to->delay_random = change_from->delay_random;
+ change_to->delay_frames = change_from->delay_frames;
+
+ change_to->trigger_element = change_from->trigger_element;
+
+ change_to->explode = change_from->explode;
+ change_to->use_content = change_from->use_content;
+ change_to->only_complete = change_from->only_complete;
+ change_to->use_random_change = change_from->use_random_change;
+
+ change_to->random = change_from->random;
+ change_to->power = change_from->power;
+
+ for (y = 0; y < 3; y++)
+ for (x = 0; x < 3; x++)
+ change_to->content[x][y] = change_from->content[x][y];
+
+ change_to->can_change = change_from->can_change;