+static struct
+{
+ int x, y;
+ int gadget_id;
+ boolean *value;
+ char *text_right, *infotext;
+} checkbutton_info[ED_NUM_CHECKBUTTONS] =
+{
+ {
+ ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(6) - MINI_TILEY,
+ GADGET_ID_DOUBLE_SPEED,
+ &level.double_speed,
+ "double speed movement", "set movement speed of player"
+ },
+ {
+ ED_SETTINGS_XPOS(0) + 340, ED_COUNTER_YPOS(6) - MINI_TILEY,
+ GADGET_ID_GRAVITY,
+ &level.gravity,
+ "gravity", "set level gravity"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(9) - MINI_TILEY,
+ GADGET_ID_RANDOM_RESTRICTED,
+ &random_placement_background_restricted,
+ "restrict random placement to", "set random placement restriction"
+ },
+ {
+ ED_SETTINGS_XPOS(0), 0, /* set at runtime */
+ GADGET_ID_STICK_ELEMENT,
+ &stick_element_properties_window,
+ "stick this screen to edit content","stick this screen to edit content"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4),
+ GADGET_ID_EM_SLIPPERY_GEMS,
+ &level.em_slippery_gems,
+ "slip down from certain flat walls","use EM style slipping behaviour"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2),
+ GADGET_ID_CUSTOM_EXPLODE_RESULT,
+ &custom_element_properties[EP_EXPLODE_RESULT],
+ NULL, "set consistency/destructibility"
+ },
+ {
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3),
+ GADGET_ID_CUSTOM_EXPLODE_FIRE,
+ &custom_element_properties[EP_CAN_EXPLODE_BY_FIRE],
+ "by fire", "element can explode by fire/explosion"
+ },
+ {
+ ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(3),
+ GADGET_ID_CUSTOM_EXPLODE_SMASH,
+ &custom_element_properties[EP_CAN_EXPLODE_SMASHED],
+ "smashed", "element can explode when smashed"
+ },
+ {
+ ED_SETTINGS_XPOS(13), ED_SETTINGS_YPOS(3),
+ GADGET_ID_CUSTOM_EXPLODE_IMPACT,
+ &custom_element_properties[EP_CAN_EXPLODE_IMPACT],
+ "impact", "element can explode on impact"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(4),
+ GADGET_ID_CUSTOM_WALK_TO_OBJECT,
+ &custom_element_properties[EP_WALK_TO_OBJECT],
+ NULL, "player can dig/collect/push element"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1),
+ GADGET_ID_CUSTOM_DEADLY,
+ &custom_element_properties[EP_DEADLY],
+ NULL, "element can kill the player"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(6),
+ GADGET_ID_CUSTOM_CAN_MOVE,
+ &custom_element_properties[EP_CAN_MOVE],
+ NULL, "element can move in some direction"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10),
+ GADGET_ID_CUSTOM_CAN_FALL,
+ &custom_element_properties[EP_CAN_FALL],
+ "can fall", "element can fall down"
+ },
+ {
+ ED_SETTINGS_XPOS(6), ED_SETTINGS_YPOS(10),
+ GADGET_ID_CUSTOM_CAN_SMASH,
+ &custom_element_properties[EP_CAN_SMASH],
+ NULL, "element can smash other elements"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11),
+ GADGET_ID_CUSTOM_SLIPPERY,
+ &custom_element_properties[EP_SLIPPERY],
+ "slippery", "other elements can fall down from it"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(12),
+ GADGET_ID_CUSTOM_WALKABLE,
+ &custom_element_properties[EP_WALKABLE],
+ NULL, "player can walk on the same field"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1),
+ GADGET_ID_CUSTOM_USE_GRAPHIC,
+ &custom_element.use_gfx_element,
+ "use graphic of element:", "use graphic for custom element"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(12),
+ GADGET_ID_CUSTOM_USE_TEMPLATE,
+ &custom_element.use_template,
+ "use template", "use template for custom properties"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2),
+ GADGET_ID_CUSTOM_CAN_CHANGE,
+ &custom_element_properties[EP_CAN_CHANGE],
+ "element changes to after/when:","element can change to other element"
+ },
+ {
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3),
+ GADGET_ID_CHANGE_DELAY,
+ &custom_element_change_events[CE_DELAY],
+ NULL, "element changes after delay"
+ },
+ {
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5),
+ GADGET_ID_CHANGE_BY_PLAYER,
+ &custom_element_change_events[CE_BY_PLAYER],
+ NULL, "element changes by player contact"
+ },
+};
+
+
+/*
+ -----------------------------------------------------------------------------
+ some internally used variables
+ -----------------------------------------------------------------------------
+*/
+
+/* actual size of level editor drawing area */
+static int ed_fieldx = MAX_ED_FIELDX - 1, ed_fieldy = MAX_ED_FIELDY - 1;
+
+/* actual position of level editor drawing area in level playfield */
+static int level_xpos = -1, level_ypos = -1;
+
+#define IN_ED_FIELD(x,y) ((x)>=0 && (x)<ed_fieldx && (y)>=0 &&(y)<ed_fieldy)
+
+/* drawing elements on the three mouse buttons */
+static int new_element1 = EL_WALL;
+static int new_element2 = EL_EMPTY;
+static int new_element3 = EL_SAND;
+
+#define BUTTON_ELEMENT(button) ((button) == 1 ? new_element1 : \
+ (button) == 2 ? new_element2 : \
+ (button) == 3 ? new_element3 : EL_EMPTY)
+#define BUTTON_STEPSIZE(button) ((button) == 1 ? 1 : (button) == 2 ? 5 : 10)
+
+/* forward declaration for internal use */
+static void ModifyEditorCounter(int, int);
+static void ModifyEditorCounterLimits(int, int, int);
+static void ModifyEditorSelectbox(int, int);
+static void ModifyEditorElementList();
+static void DrawDrawingWindow();
+static void DrawLevelInfoWindow();
+static void DrawPropertiesWindow();
+static boolean checkPropertiesConfig();
+static void CopyLevelToUndoBuffer(int);
+static void HandleDrawingAreas(struct GadgetInfo *);
+static void HandleCounterButtons(struct GadgetInfo *);
+static void HandleTextInputGadgets(struct GadgetInfo *);
+static void HandleSelectboxGadgets(struct GadgetInfo *);
+static void HandleTextbuttonGadgets(struct GadgetInfo *);
+static void HandleRadiobuttons(struct GadgetInfo *);
+static void HandleCheckbuttons(struct GadgetInfo *);
+static void HandleControlButtons(struct GadgetInfo *);
+static void HandleDrawingAreaInfo(struct GadgetInfo *);
+
+static struct GadgetInfo *level_editor_gadget[NUM_EDITOR_GADGETS];
+
+static int drawing_function = GADGET_ID_SINGLE_ITEMS;
+static int last_drawing_function = GADGET_ID_SINGLE_ITEMS;
+static boolean draw_with_brush = FALSE;
+static int properties_element = 0;
+
+static short FieldBackup[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+static short UndoBuffer[NUM_UNDO_STEPS][MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+static int undo_buffer_position = 0;
+static int undo_buffer_steps = 0;