#define GADGET_ID_CUSTOM_COPY (GADGET_ID_TOOLBOX_FIRST + 25)
#define GADGET_ID_CUSTOM_PASTE (GADGET_ID_TOOLBOX_FIRST + 26)
-/* counter button identifiers */
+/* counter gadget identifiers */
#define GADGET_ID_COUNTER_FIRST (GADGET_ID_TOOLBOX_FIRST + 27)
#define GADGET_ID_SELECT_LEVEL_DOWN (GADGET_ID_COUNTER_FIRST + 0)
#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 20)
#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 21)
#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 42)
-#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 43)
-#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 44)
-#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 45)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 46)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 47)
+#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 47)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 48)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 49)
/* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 48)
+#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 50)
#define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \
ED_NUM_ELEMENTLIST_BUTTONS - 1)
#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 18
#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 19
#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 20
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 21
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 22
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 23
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 24
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 25
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 26
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 27
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 28
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 29
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 30
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 31
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 32
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 33
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 34
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 35
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 36
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 37
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY 38
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 39
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 40
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 41
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 42
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 43
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 44
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 45
-
-#define ED_NUM_CHECKBUTTONS 46
+#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 21
+#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 22
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 23
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 24
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 25
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 26
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 27
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 28
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 29
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 30
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 31
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 32
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 33
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 34
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 35
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 36
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 37
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 38
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 39
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY 40
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 41
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 42
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 43
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 44
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 45
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 46
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 47
+
+#define ED_NUM_CHECKBUTTONS 48
#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
#define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
MIN_ENVELOPE_XSIZE, MAX_ENVELOPE_XSIZE,
GADGET_ID_ENVELOPE_XSIZE_DOWN, GADGET_ID_ENVELOPE_XSIZE_UP,
GADGET_ID_ENVELOPE_XSIZE_TEXT, GADGET_ID_NONE,
- NULL,
+ NULL, /* will be set when used */
NULL, NULL, "width",
},
{
MIN_ENVELOPE_YSIZE, MAX_ENVELOPE_YSIZE,
GADGET_ID_ENVELOPE_YSIZE_DOWN, GADGET_ID_ENVELOPE_YSIZE_UP,
GADGET_ID_ENVELOPE_YSIZE_TEXT, GADGET_ID_ENVELOPE_XSIZE_UP,
- NULL,
+ NULL, /* will be set when used */
NULL, " ", "height",
},
} textarea_info[ED_NUM_TEXTAREAS] =
{
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_ENVELOPE_INFO,
MAX_ENVELOPE_XSIZE, MAX_ENVELOPE_YSIZE,
NULL,
- "Envelope Info:", "Envelope Info"
+ "Envelope Content:", "Envelope Content"
}
};
NULL,
"deadly when colliding with", "element is deadly when hitting player"
},
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_ENVELOPE_AUTOWRAP, GADGET_ID_NONE,
+ &level.envelope[0].autowrap,
+ NULL,
+ "auto-wrap", "automatically wrap envelope text"
+ },
+ {
+ -1, ED_ELEMENT_SETTINGS_YPOS(1),
+ GADGET_ID_ENVELOPE_CENTERED, GADGET_ID_ENVELOPE_AUTOWRAP,
+ &level.envelope[0].centered,
+ " ",
+ "centered", "automatically center envelope text"
+ },
/* ---------- element settings: configure 1 (custom elements) ----------- */
/* !!! add separate "use existing element sound" !!! */
#if 0
- NULL, "use graphic/sound of element:", "use existing graphic and sound"
+ NULL,
+ "use graphic/sound of element:", "use existing graphic and sound"
#else
- NULL, "use graphic of element:", "use existing element graphic"
+ NULL,
+ "use graphic of element:", "use existing element graphic"
#endif
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_CUSTOM_USE_TEMPLATE, GADGET_ID_NONE,
&level.use_custom_template,
- NULL, "use template", "use template for custom properties"
+ NULL,
+ "use template", "use template for custom properties"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3),
GADGET_ID_CUSTOM_ACCESSIBLE, GADGET_ID_NONE,
&custom_element_properties[EP_ACCESSIBLE],
- NULL, NULL, "player can walk to or pass this field"
+ NULL,
+ NULL, "player can walk to or pass this field"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
GADGET_ID_CUSTOM_GRAV_REACHABLE, GADGET_ID_NONE,
&custom_element_properties[EP_GRAVITY_REACHABLE],
- NULL, "reachable despite gravity", "player can walk/dig despite gravity"
+ NULL,
+ "reachable despite gravity", "player can walk/dig despite gravity"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13),
GADGET_ID_CUSTOM_USE_LAST_VALUE, GADGET_ID_NONE,
&custom_element.use_last_ce_value,
- NULL, "use last CE value after change", "use last CE value after change"
+ NULL,
+ "use last CE value after change", "use last CE value after change"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5),
GADGET_ID_CUSTOM_WALK_TO_OBJECT, GADGET_ID_NONE,
&custom_element_properties[EP_WALK_TO_OBJECT],
- NULL, NULL, "player can dig/collect/push element"
+ NULL,
+ NULL, "player can dig/collect/push element"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_INDESTRUCTIBLE, GADGET_ID_NONE,
&custom_element_properties[EP_INDESTRUCTIBLE],
- NULL, "indestructible", "element is indestructible"
+ NULL,
+ "indestructible", "element is indestructible"
},
/* ---------- element settings: configure 2 (custom elements) ----------- */
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_CUSTOM_CAN_MOVE, GADGET_ID_NONE,
&custom_element_properties[EP_CAN_MOVE],
- NULL, NULL, "element can move with some pattern"
+ NULL,
+ NULL, "element can move with some pattern"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7),
GADGET_ID_CUSTOM_CAN_FALL, GADGET_ID_NONE,
&custom_element_properties[EP_CAN_FALL],
- NULL, "can fall", "element can fall down"
+ NULL,
+ "can fall", "element can fall down"
},
{
-1, ED_ELEMENT_SETTINGS_YPOS(7),
GADGET_ID_CUSTOM_CAN_SMASH, GADGET_ID_CUSTOM_CAN_FALL,
&custom_element_properties[EP_CAN_SMASH],
- " ", NULL, "element can smash other elements"
+ " ",
+ NULL, "element can smash other elements"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE,
&custom_element_properties[EP_SLIPPERY],
- NULL, NULL, "other elements can fall down from it"
+ NULL,
+ NULL, "other elements can fall down from it"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_DEADLY, GADGET_ID_NONE,
&custom_element_properties[EP_DEADLY],
- NULL, NULL, "element can kill the player"
+ NULL,
+ NULL, "element can kill the player"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
GADGET_ID_CUSTOM_CAN_EXPLODE, GADGET_ID_NONE,
&custom_element_properties[EP_CAN_EXPLODE],
- NULL, NULL, "element can explode"
+ NULL,
+ NULL, "element can explode"
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(11),
GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE,
&custom_element_properties[EP_EXPLODES_BY_FIRE],
- NULL, "by fire", "element can explode by fire/explosion"
+ NULL,
+ "by fire", "element can explode by fire/explosion"
},
{
-1, ED_ELEMENT_SETTINGS_YPOS(11),
GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE,
&custom_element_properties[EP_EXPLODES_SMASHED],
- " ", "smashed", "element can explode when smashed"
+ " ",
+ "smashed", "element can explode when smashed"
},
{
-1, ED_ELEMENT_SETTINGS_YPOS(11),
GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH,
&custom_element_properties[EP_EXPLODES_IMPACT],
- " ", "impact", "element can explode on impact"
+ " ",
+ "impact", "element can explode on impact"
},
/* ---------- element settings: advanced (custom elements) --------------- */
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1),
GADGET_ID_CUSTOM_CAN_CHANGE, GADGET_ID_NONE,
&custom_element_change.can_change,
- NULL, "element changes to:", "change element on specified condition"
+ NULL,
+ "element changes to:", "change element on specified condition"
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2),
GADGET_ID_CHANGE_DELAY, GADGET_ID_NONE,
&custom_element_change_events[CE_DELAY],
- NULL, NULL, "element changes after delay"
+ NULL,
+ NULL, "element changes after delay"
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4),
GADGET_ID_CHANGE_BY_DIRECT_ACT, GADGET_ID_NONE,
&custom_element_change_events[CE_BY_DIRECT_ACTION],
- NULL, NULL, "element changes by direct action"
+ NULL,
+ NULL, "element changes by direct action"
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5),
GADGET_ID_CHANGE_BY_OTHER_ACT, GADGET_ID_NONE,
&custom_element_change_events[CE_BY_OTHER_ACTION],
- NULL, NULL, "element changes by other element"
+ NULL,
+ NULL, "element changes by other element"
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(8),
GADGET_ID_CHANGE_USE_EXPLOSION, GADGET_ID_NONE,
&custom_element_change.explode,
- NULL, "explode instead of change", "element explodes instead of change"
+ NULL,
+ "explode instead of change", "element explodes instead of change"
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9),
GADGET_ID_CHANGE_USE_CONTENT, GADGET_ID_NONE,
&custom_element_change.use_target_content,
- NULL, "use extended change target:","element changes to more elements"
+ NULL,
+ "use extended change target:", "element changes to more elements"
},
{
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(11),
GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE,
&custom_element_change.only_if_complete,
- NULL, "replace all or nothing", "only replace when all can be changed"
+ NULL,
+ "replace all or nothing", "only replace when all can be changed"
},
{
ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(12),
GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE,
&custom_element_change.use_random_replace,
- NULL, NULL, "use percentage for random replace"
+ NULL,
+ NULL, "use percentage for random replace"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13),
GADGET_ID_CHANGE_HAS_ACTION, GADGET_ID_NONE,
&custom_element_change.has_action,
- NULL, NULL, "execute action on specified condition"
+ NULL,
+ NULL, "execute action on specified condition"
},
};
/* actual position of level editor drawing area in level playfield */
static int level_xpos = -1, level_ypos = -1;
+#if 1
+#define IN_ED_FIELD(x,y) IN_FIELD(x, y, ed_fieldx, ed_fieldy)
+#else
#define IN_ED_FIELD(x,y) ((x)>=0 && (x)<ed_fieldx && (y)>=0 &&(y)<ed_fieldy)
+#endif
/* drawing elements on the three mouse buttons */
static int new_element1 = EL_WALL;
static short FieldBackup[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
static short UndoBuffer[NUM_UNDO_STEPS][MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+static short IntelliDrawBuffer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
static int undo_buffer_position = 0;
static int undo_buffer_steps = 0;
int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width;
int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1;
- return DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line,
- max_lines_per_screen, TRUE);
+ return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
+ max_lines_per_screen, -1, TRUE, FALSE, FALSE);
}
static void DrawPropertiesTabulatorGadgets()
{
int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE;
int counter2_id = ED_COUNTER_ID_ENVELOPE_YSIZE;
+ int button1_id = ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP;
+ int button2_id = ED_CHECKBUTTON_ID_ENVELOPE_CENTERED;
int envelope_nr = properties_element - EL_ENVELOPE_1;
counterbutton_info[counter1_id].value = &level.envelope[envelope_nr].xsize;
counterbutton_info[counter2_id].value = &level.envelope[envelope_nr].ysize;
+ checkbutton_info[button1_id].value = &level.envelope[envelope_nr].autowrap;
+ checkbutton_info[button2_id].value = &level.envelope[envelope_nr].centered;
+
/* display counter to choose size of envelope text area */
- MapCounterButtons(ED_COUNTER_ID_ENVELOPE_XSIZE);
- MapCounterButtons(ED_COUNTER_ID_ENVELOPE_YSIZE);
+ MapCounterButtons(counter1_id);
+ MapCounterButtons(counter2_id);
+
+ /* display checkbuttons to choose auto-wrap and alignment properties */
+ MapCheckbuttonGadget(button1_id);
+ MapCheckbuttonGadget(button2_id);
DrawEnvelopeTextArea(envelope_nr);
}
}
}
+static int getDirectionFromTube(int element)
+{
+ switch (element)
+ {
+ case EL_TUBE_LEFT_UP: return (MV_LEFT | MV_UP);
+ case EL_TUBE_LEFT_DOWN: return (MV_LEFT | MV_DOWN);
+ case EL_TUBE_RIGHT_UP: return (MV_RIGHT | MV_UP);
+ case EL_TUBE_RIGHT_DOWN: return (MV_RIGHT | MV_DOWN);
+ case EL_TUBE_HORIZONTAL: return (MV_HORIZONTAL);
+ case EL_TUBE_HORIZONTAL_UP: return (MV_HORIZONTAL | MV_UP);
+ case EL_TUBE_HORIZONTAL_DOWN: return (MV_HORIZONTAL | MV_DOWN);
+ case EL_TUBE_VERTICAL: return (MV_VERTICAL);
+ case EL_TUBE_VERTICAL_LEFT: return (MV_VERTICAL | MV_LEFT);
+ case EL_TUBE_VERTICAL_RIGHT: return (MV_VERTICAL | MV_RIGHT);
+ case EL_TUBE_ANY: return (MV_ANY_DIRECTION);
+ }
+
+ return MV_NONE;
+}
+
+static int getTubeFromDirection(int direction)
+{
+ switch (direction)
+ {
+ case (MV_LEFT | MV_UP): return EL_TUBE_LEFT_UP;
+ case (MV_LEFT | MV_DOWN): return EL_TUBE_LEFT_DOWN;
+ case (MV_RIGHT | MV_UP): return EL_TUBE_RIGHT_UP;
+ case (MV_RIGHT | MV_DOWN): return EL_TUBE_RIGHT_DOWN;
+ case (MV_HORIZONTAL): return EL_TUBE_HORIZONTAL;
+ case (MV_HORIZONTAL | MV_UP): return EL_TUBE_HORIZONTAL_UP;
+ case (MV_HORIZONTAL | MV_DOWN): return EL_TUBE_HORIZONTAL_DOWN;
+ case (MV_VERTICAL): return EL_TUBE_VERTICAL;
+ case (MV_VERTICAL | MV_LEFT): return EL_TUBE_VERTICAL_LEFT;
+ case (MV_VERTICAL | MV_RIGHT): return EL_TUBE_VERTICAL_RIGHT;
+ case (MV_ANY_DIRECTION): return EL_TUBE_ANY;
+
+ /* if only one direction, fall back to simple tube with that direction */
+ case (MV_LEFT): return EL_TUBE_HORIZONTAL;
+ case (MV_RIGHT): return EL_TUBE_HORIZONTAL;
+ case (MV_UP): return EL_TUBE_VERTICAL;
+ case (MV_DOWN): return EL_TUBE_VERTICAL;
+ }
+
+ return EL_EMPTY;
+}
+
+static int getTubeFromDirectionNotEmpty(int direction, int element_old)
+{
+ int element_new = getTubeFromDirection(direction);
+
+ return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromBelt(int element)
+{
+ int belt_dir = getBeltDirFromBeltElement(element);
+
+ return (belt_dir == MV_LEFT ? MV_RIGHT :
+ belt_dir == MV_RIGHT ? MV_LEFT :
+ belt_dir == MV_NONE ? MV_HORIZONTAL : belt_dir);
+}
+
+static int getBeltFromNrAndOpenDirection(int nr, int direction)
+{
+ int belt_dir = (direction == MV_LEFT ? MV_RIGHT :
+ direction == MV_RIGHT ? MV_LEFT :
+ direction == MV_HORIZONTAL ? MV_NONE : direction);
+
+ return getBeltElementFromBeltNrAndBeltDir(nr, belt_dir);
+}
+
+static int getClosedTube(int x, int y)
+{
+ static int xy[4][2] =
+ {
+ { -1, 0 },
+ { +1, 0 },
+ { 0, -1 },
+ { 0, +1 }
+ };
+ int element_old = IntelliDrawBuffer[x][y];
+ int tube_direction_old = getDirectionFromTube(element_old);
+ int tube_direction_new = MV_NONE;
+ int i;
+
+ for (i = 0; i < NUM_DIRECTIONS; i++)
+ {
+ int xx = x + xy[i][0];
+ int yy = y + xy[i][1];
+ int dir = MV_DIR_FROM_BIT(i);
+ int dir_opposite = MV_DIR_OPPOSITE(dir);
+
+ if (IN_LEV_FIELD(xx, yy) && IS_TUBE(IntelliDrawBuffer[xx][yy]) &&
+ (tube_direction_old & dir) &&
+ (getDirectionFromTube(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+ tube_direction_new |= dir;
+ }
+
+ return getTubeFromDirectionNotEmpty(tube_direction_new, element_old);
+}
+
+static int getClosedBelt(int x, int y)
+{
+ static int xy[2][2] =
+ {
+ { -1, 0 },
+ { +1, 0 },
+ };
+ int element_old = IntelliDrawBuffer[x][y];
+ int belt_nr = getBeltNrFromBeltElement(element_old);
+ int belt_direction_old = getOpenDirectionFromBelt(element_old);
+ int belt_direction_new = MV_NONE;
+ int i;
+
+ for (i = 0; i < 2; i++)
+ {
+ int xx = x + xy[i][0];
+ int yy = y + xy[i][1];
+ int dir = MV_DIR_FROM_BIT(i);
+ int dir_opposite = MV_DIR_OPPOSITE(dir);
+
+ if (IN_LEV_FIELD(xx, yy) && IS_BELT(IntelliDrawBuffer[xx][yy]) &&
+ (belt_direction_old & dir) &&
+ (getOpenDirectionFromBelt(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+ belt_direction_new |= dir;
+ }
+
+ return getBeltFromNrAndOpenDirection(belt_nr, belt_direction_new);
+}
+
+static void SetElementSimple(int x, int y, int element, boolean change_level)
+{
+ if (change_level)
+ Feld[x][y] = element;
+
+ IntelliDrawBuffer[x][y] = element;
+
+ if (IN_ED_FIELD(x - level_xpos, y - level_ypos))
+ DrawMiniElement(x - level_xpos, y - level_ypos, element);
+}
+
+static void SetElementIntelliDraw(int x, int y, int new_element,
+ boolean change_level)
+{
+ static int last_x = -1;
+ static int last_y = -1;
+ int old_element = IntelliDrawBuffer[x][y];
+
+ if (new_element == EL_UNDEFINED)
+ {
+ last_x = -1;
+ last_y = -1;
+
+ return;
+ }
+
+ if (IS_TUBE(new_element))
+ {
+ static int xy[4][2] =
+ {
+ { -1, 0 },
+ { +1, 0 },
+ { 0, -1 },
+ { 0, +1 }
+ };
+ boolean last_element_is_neighbour = FALSE;
+ int last_element_new;
+ int direction = MV_NONE;
+ int i;
+
+ /* if existing element is tube, keep all existing tube directions */
+ if (IS_TUBE(old_element))
+ direction |= getDirectionFromTube(old_element);
+
+ for (i = 0; i < NUM_DIRECTIONS; i++)
+ {
+ int xx = x + xy[i][0];
+ int yy = y + xy[i][1];
+
+ if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+ IS_TUBE(IntelliDrawBuffer[last_x][last_y]))
+ {
+ int dir = MV_DIR_FROM_BIT(i);
+ int dir_opposite = MV_DIR_OPPOSITE(dir);
+ int last_element_old = IntelliDrawBuffer[last_x][last_y];
+ int last_direction_old = getDirectionFromTube(last_element_old);
+ int last_direction_new = last_direction_old | dir_opposite;
+
+ last_element_new = getTubeFromDirection(last_direction_new);
+ last_element_is_neighbour = TRUE;
+
+ direction |= dir;
+ }
+ }
+
+ new_element = getTubeFromDirectionNotEmpty(direction, new_element);
+
+ /* reduce connections of neighbour tube elements to minimal connections */
+ if (last_element_is_neighbour)
+ {
+ /* set neighbour tube elements to newly determined tube connections */
+ SetElementSimple(x, y, new_element, change_level);
+ SetElementSimple(last_x, last_y, last_element_new, change_level);
+
+ /* remove all open tube connections of neighbour tube elements */
+ new_element = getClosedTube(x, y);
+ last_element_new = getClosedTube(last_x, last_y);
+
+ /* set neighbour tube elements to new, minimized tube connections */
+ SetElementSimple(x, y, new_element, change_level);
+ SetElementSimple(last_x, last_y, last_element_new, change_level);
+ }
+ }
+ else if (IS_ACID_POOL(new_element))
+ {
+ int last_element_new = EL_UNDEFINED;
+
+ if (IS_ACID_POOL(old_element))
+ {
+ new_element = old_element;
+ }
+
+ if (last_x == x - 1 && last_y == y && IN_LEV_FIELD(last_x, last_y) &&
+ IS_ACID_POOL(IntelliDrawBuffer[last_x][last_y]))
+ {
+ if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_TOPLEFT)
+ {
+ new_element = EL_ACID_POOL_TOPRIGHT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_TOPRIGHT)
+ {
+ last_element_new = EL_ACID;
+ new_element = EL_ACID_POOL_TOPRIGHT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_BOTTOMLEFT)
+ {
+ new_element = EL_ACID_POOL_BOTTOMRIGHT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_BOTTOMRIGHT)
+ {
+ last_element_new = EL_ACID_POOL_BOTTOM;
+ new_element = EL_ACID_POOL_BOTTOMRIGHT;
+ }
+ }
+ else if (last_x == x + 1 && last_y == y && IN_LEV_FIELD(last_x, last_y) &&
+ IS_ACID_POOL(IntelliDrawBuffer[last_x][last_y]))
+ {
+ if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_TOPLEFT)
+ {
+ last_element_new = EL_ACID;
+ new_element = EL_ACID_POOL_TOPLEFT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_TOPRIGHT)
+ {
+ new_element = EL_ACID_POOL_TOPLEFT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_BOTTOMLEFT)
+ {
+ last_element_new = EL_ACID_POOL_BOTTOM;
+ new_element = EL_ACID_POOL_BOTTOMLEFT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_BOTTOMRIGHT)
+ {
+ new_element = EL_ACID_POOL_BOTTOMLEFT;
+ }
+ }
+ else if (last_x == x && last_y == y - 1 && IN_LEV_FIELD(last_x, last_y) &&
+ IS_ACID_POOL(IntelliDrawBuffer[last_x][last_y]))
+ {
+ if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_TOPLEFT)
+ {
+ new_element = EL_ACID_POOL_BOTTOMLEFT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_TOPRIGHT)
+ {
+ new_element = EL_ACID_POOL_BOTTOMRIGHT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_BOTTOMLEFT)
+ {
+ last_element_new = EL_ACID_POOL_TOPLEFT;
+ new_element = EL_ACID_POOL_BOTTOMLEFT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_BOTTOMRIGHT)
+ {
+ last_element_new = EL_ACID_POOL_TOPRIGHT;
+ new_element = EL_ACID_POOL_BOTTOMRIGHT;
+ }
+ else
+ {
+ last_element_new = EL_ACID;
+ new_element = EL_ACID_POOL_BOTTOM;
+ }
+ }
+ else if (last_x == x && last_y == y + 1 && IN_LEV_FIELD(last_x, last_y) &&
+ IS_ACID_POOL(IntelliDrawBuffer[last_x][last_y]))
+ {
+ if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_TOPLEFT)
+ {
+ new_element = EL_ACID_POOL_TOPLEFT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_TOPRIGHT)
+ {
+ new_element = EL_ACID_POOL_TOPRIGHT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_BOTTOMLEFT)
+ {
+ new_element = EL_ACID_POOL_TOPLEFT;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == EL_ACID_POOL_BOTTOMRIGHT)
+ {
+ new_element = EL_ACID_POOL_TOPRIGHT;
+ }
+ else
+ {
+ last_element_new = EL_ACID;
+ new_element = EL_ACID;
+ }
+ }
+
+ if (last_element_new != EL_UNDEFINED)
+ SetElementSimple(last_x, last_y, last_element_new, change_level);
+ }
+ else if (IS_BELT(new_element))
+ {
+ int last_element_new = EL_UNDEFINED;
+ int belt_nr = getBeltNrFromBeltElement(new_element);
+#if 0
+ int belt_left = getBeltElementFromBeltNrAndBeltDir(belt_nr, MV_LEFT);
+#endif
+ int belt_middle = getBeltElementFromBeltNrAndBeltDir(belt_nr, MV_NONE);
+#if 0
+ int belt_right = getBeltElementFromBeltNrAndBeltDir(belt_nr, MV_RIGHT);
+#endif
+ boolean last_element_is_neighbour = FALSE;
+
+#if 0
+ if (IS_BELT(old_element))
+ {
+ new_element = old_element;
+ }
+#endif
+
+ if (last_x == x - 1 && last_y == y && IN_LEV_FIELD(last_x, last_y) &&
+ IS_BELT(IntelliDrawBuffer[last_x][last_y]))
+ {
+ last_element_new = IntelliDrawBuffer[last_x][last_y];
+
+#if 1
+ last_element_new = belt_middle;
+ new_element = belt_middle;
+#else
+ if (IntelliDrawBuffer[last_x][last_y] == belt_left)
+ {
+ new_element = belt_right;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == belt_right)
+ {
+ last_element_new = belt_middle;
+ new_element = belt_right;
+ }
+#endif
+
+ last_element_is_neighbour = TRUE;
+ }
+ else if (last_x == x + 1 && last_y == y && IN_LEV_FIELD(last_x, last_y) &&
+ IS_BELT(IntelliDrawBuffer[last_x][last_y]))
+ {
+ last_element_new = IntelliDrawBuffer[last_x][last_y];
+
+#if 1
+ last_element_new = belt_middle;
+ new_element = belt_middle;
+#else
+ if (IntelliDrawBuffer[last_x][last_y] == belt_left)
+ {
+ last_element_new = belt_middle;
+ new_element = belt_left;
+ }
+ else if (IntelliDrawBuffer[last_x][last_y] == belt_right)
+ {
+ new_element = belt_left;
+ }
+#endif
+
+ last_element_is_neighbour = TRUE;
+ }
+
+ if (last_element_new != EL_UNDEFINED)
+ SetElementSimple(last_x, last_y, last_element_new, change_level);
+
+ /* reduce connections of neighbour belt elements to minimal connections */
+ if (last_element_is_neighbour)
+ {
+ /* set neighbour belt elements to newly determined belt connections */
+ SetElementSimple(x, y, new_element, change_level);
+ SetElementSimple(last_x, last_y, last_element_new, change_level);
+
+ /* remove all open belt connections of neighbour belt elements */
+ new_element = getClosedBelt(x, y);
+ last_element_new = getClosedBelt(last_x, last_y);
+
+ /* set neighbour belt elements to new, minimized belt connections */
+ SetElementSimple(x, y, new_element, change_level);
+ SetElementSimple(last_x, last_y, last_element_new, change_level);
+ }
+ }
+ else if (new_element == EL_EMC_WALL_1 ||
+ new_element == EL_EMC_WALL_2 ||
+ new_element == EL_EMC_WALL_3)
+ {
+ int last_element_new = EL_UNDEFINED;
+
+ if (last_x == x && last_y == y - 1 && IN_LEV_FIELD(last_x, last_y) &&
+ (IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_1 ||
+ IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_2 ||
+ IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_3))
+ {
+ if (IN_LEV_FIELD(last_x, last_y - 1))
+ {
+ if (IntelliDrawBuffer[last_x][last_y - 1] != EL_EMC_WALL_1 &&
+ IntelliDrawBuffer[last_x][last_y - 1] != EL_EMC_WALL_2)
+ last_element_new = EL_EMC_WALL_1;
+ else if (IntelliDrawBuffer[last_x][last_y - 1] == EL_EMC_WALL_1 ||
+ IntelliDrawBuffer[last_x][last_y - 1] == EL_EMC_WALL_2)
+ last_element_new = EL_EMC_WALL_2;
+ }
+
+ new_element = EL_EMC_WALL_3;
+ }
+ else if (last_x == x && last_y == y + 1 && IN_LEV_FIELD(last_x, last_y) &&
+ (IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_1 ||
+ IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_2 ||
+ IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_3))
+ {
+ if (IN_LEV_FIELD(last_x, last_y + 1))
+ {
+ if (IntelliDrawBuffer[last_x][last_y + 1] != EL_EMC_WALL_2 &&
+ IntelliDrawBuffer[last_x][last_y + 1] != EL_EMC_WALL_3)
+ last_element_new = EL_EMC_WALL_3;
+ else if (IntelliDrawBuffer[last_x][last_y + 1] == EL_EMC_WALL_2 ||
+ IntelliDrawBuffer[last_x][last_y + 1] == EL_EMC_WALL_3)
+ last_element_new = EL_EMC_WALL_2;
+ }
+
+ new_element = EL_EMC_WALL_1;
+ }
+
+ if (last_element_new != EL_UNDEFINED)
+ SetElementSimple(last_x, last_y, last_element_new, change_level);
+ }
+ else if (IS_BELT_SWITCH(old_element))
+ {
+ int belt_nr = getBeltNrFromBeltSwitchElement(old_element);
+ int belt_dir = getBeltDirFromBeltSwitchElement(old_element);
+
+ belt_dir = (belt_dir == MV_LEFT ? MV_NONE :
+ belt_dir == MV_NONE ? MV_RIGHT : MV_LEFT);
+
+ new_element = getBeltSwitchElementFromBeltNrAndBeltDir(belt_nr, belt_dir);
+ }
+ else
+ {
+ static int swappable_elements[][2] =
+ {
+ { EL_EXIT_CLOSED, EL_EXIT_OPEN },
+ { EL_DYNAMITE, EL_DYNAMITE_ACTIVE },
+ { EL_EM_DYNAMITE, EL_EM_DYNAMITE_ACTIVE },
+ { EL_QUICKSAND_EMPTY, EL_QUICKSAND_FULL },
+ { EL_EMERALD, EL_WALL_EMERALD },
+ { EL_EMERALD_YELLOW, EL_WALL_EMERALD_YELLOW },
+ { EL_EMERALD_RED, EL_WALL_EMERALD_RED },
+ { EL_EMERALD_PURPLE, EL_WALL_EMERALD_PURPLE },
+ { EL_DIAMOND, EL_WALL_DIAMOND },
+ { EL_BD_DIAMOND, EL_WALL_BD_DIAMOND },
+ { EL_GATE_1, EL_GATE_1_GRAY },
+ { EL_GATE_2, EL_GATE_2_GRAY },
+ { EL_GATE_3, EL_GATE_3_GRAY },
+ { EL_GATE_4, EL_GATE_4_GRAY },
+ { EL_EM_GATE_1, EL_EM_GATE_1_GRAY },
+ { EL_EM_GATE_2, EL_EM_GATE_2_GRAY },
+ { EL_EM_GATE_3, EL_EM_GATE_3_GRAY },
+ { EL_EM_GATE_4, EL_EM_GATE_4_GRAY },
+ { EL_EMC_GATE_5, EL_EMC_GATE_5_GRAY },
+ { EL_EMC_GATE_6, EL_EMC_GATE_6_GRAY },
+ { EL_EMC_GATE_7, EL_EMC_GATE_7_GRAY },
+ { EL_EMC_GATE_8, EL_EMC_GATE_8_GRAY },
+ { EL_DC_GATE_WHITE, EL_DC_GATE_WHITE_GRAY },
+ { EL_TIME_ORB_EMPTY, EL_TIME_ORB_FULL },
+ { EL_LAMP, EL_LAMP_ACTIVE },
+ { EL_SOKOBAN_FIELD_EMPTY, EL_SOKOBAN_FIELD_FULL },
+ { EL_SP_BASE, EL_SP_BUGGY_BASE },
+ { EL_PEARL, EL_WALL_PEARL },
+ { EL_CRYSTAL, EL_WALL_CRYSTAL },
+ { EL_TIMEGATE_CLOSED, EL_TIMEGATE_OPEN },
+ { EL_SWITCHGATE_CLOSED, EL_SWITCHGATE_OPEN },
+ { EL_SWITCHGATE_SWITCH_UP, EL_SWITCHGATE_SWITCH_DOWN },
+ { EL_DC_SWITCHGATE_SWITCH_UP, EL_DC_SWITCHGATE_SWITCH_DOWN },
+ { EL_LIGHT_SWITCH, EL_LIGHT_SWITCH_ACTIVE },
+ { EL_LANDMINE, EL_DC_LANDMINE },
+ { EL_SHIELD_NORMAL, EL_SHIELD_DEADLY },
+ { EL_STEEL_EXIT_CLOSED, EL_STEEL_EXIT_OPEN },
+ { EL_EM_EXIT_CLOSED, EL_EM_EXIT_OPEN },
+ { EL_EM_STEEL_EXIT_CLOSED, EL_EM_STEEL_EXIT_OPEN },
+ { EL_QUICKSAND_FAST_EMPTY, EL_QUICKSAND_FAST_FULL },
+
+ { -1, -1 },
+ };
+ int i;
+
+ for (i = 0; swappable_elements[i][0] != -1; i++)
+ {
+ int element1 = swappable_elements[i][0];
+ int element2 = swappable_elements[i][1];
+
+ if (old_element == element1 || old_element == element2)
+ new_element = (old_element == element1 ? element2 : element1);
+ }
+ }
+
+ SetElementSimple(x, y, new_element, change_level);
+
+ last_x = x;
+ last_y = y;
+}
+
+static void ResetIntelliDraw()
+{
+ int x, y;
+
+ for (x = 0; x < lev_fieldx; x++)
+ for (y = 0; y < lev_fieldy; y++)
+ IntelliDrawBuffer[x][y] = Feld[x][y];
+
+ SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE);
+}
+
+static void SetElementExt(int x, int y, int element, boolean change_level)
+{
+ if (element < 0)
+ {
+ element = IntelliDrawBuffer[x][y] = Feld[x][y];
+ SetElementSimple(x, y, element, change_level);
+
+ return;
+ }
+
+ if (GetKeyModState() & KMOD_Shift)
+ SetElementIntelliDraw(x, y, element, change_level);
+ else
+ SetElementSimple(x, y, element, change_level);
+}
+
+static void SetElement(int x, int y, int element)
+{
+ SetElementExt(x, y, element, TRUE);
+}
+
static void DrawLineElement(int sx, int sy, int element, boolean change_level)
{
+#if 1
+ int lx = sx + level_xpos;
+ int ly = sy + level_ypos;
+
+ SetElementExt(lx, ly, element, change_level);
+
+#else
+
int lx = sx + level_xpos;
int ly = sy + level_ypos;
+ int element_new = (element < 0 ? Feld[lx][ly] : element);
- DrawMiniElement(sx, sy, (element < 0 ? Feld[lx][ly] : element));
+ DrawMiniElement(sx, sy, element_new);
if (change_level)
Feld[lx][ly] = element;
+#endif
}
static void DrawLine(int from_x, int from_y, int to_x, int to_y,
for (y = 0; y < brush_height; y++)
{
- for (x=0; x < brush_width; x++)
+ for (x = 0; x < brush_width; x++)
{
brush_buffer[x][y] = Feld[from_lx + x][from_ly + y];
actual_drawing_function = GADGET_ID_PICK_ELEMENT;
}
+ if (GetKeyModState() & KMOD_Shift)
+ {
+ if (button_press_event || button_release_event)
+ ResetIntelliDraw();
+ }
+
switch (actual_drawing_function)
{
case GADGET_ID_SINGLE_ITEMS:
if (edit_mode == ED_MODE_DRAWING && draw_with_brush &&
!inside_drawing_area)
DeleteBrushFromCursor();
+
+#if 0
+ ResetIntelliDraw();
+#endif
}
- if (!button)
+ if (!button || button_release_event)
break;
if (draw_with_brush)
{
+#if 0
if (!button_release_event)
+#endif
CopyBrushToLevel(sx, sy, button);
}
+#if 1
+ else
+#else
else if (new_element != Feld[lx][ly])
+#endif
{
if (new_element == EL_PLAYER_1)
{
{
if (Feld[x][y] == EL_PLAYER_1)
{
+#if 1
+ SetElement(x, y, EL_EMPTY);
+#else
Feld[x][y] = EL_EMPTY;
+#if 1
+ if (IN_ED_FIELD(x - level_xpos, y - level_ypos))
+ DrawMiniElement(x - level_xpos, y - level_ypos, EL_EMPTY);
+#else
if (x - level_xpos >= 0 && x - level_xpos < ed_fieldx &&
y - level_ypos >= 0 && y - level_ypos < ed_fieldy)
- DrawMiniElement(x - level_xpos, y - level_ypos,
- EL_EMPTY);
+ DrawMiniElement(x - level_xpos, y - level_ypos, EL_EMPTY);
+#endif
+#endif
}
}
}
}
+#if 1
+ SetElement(lx, ly, new_element);
+#else
Feld[lx][ly] = new_element;
DrawMiniElement(sx, sy, new_element);
+#endif
}
}
else