/***********************************************************
* Rocks'n'Diamonds -- McDuffin Strikes Back! *
*----------------------------------------------------------*
-* (c) 1995-2002 Artsoft Entertainment *
+* (c) 1995-2006 Artsoft Entertainment *
* Holger Schemel *
* Detmolder Strasse 189 *
* 33604 Bielefeld *
#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_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12)
#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 13)
#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#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_SHIFTED_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 47)
+#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 48)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 49)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 50)
/* 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 + 51)
#define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \
ED_NUM_ELEMENTLIST_BUTTONS - 1)
#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 10
#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 11
#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 12
-#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 13
-#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 14
-#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 15
-#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 16
-#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 17
-#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_SHIFTED_RELOCATION 13
+#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 14
+#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 15
+#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 16
+#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 17
+#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 18
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 19
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 20
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 21
+#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 22
+#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 23
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 24
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 25
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 26
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 27
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 28
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 29
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 30
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 31
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 32
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 33
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 34
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 35
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 36
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 37
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 38
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 39
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 40
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY 41
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 42
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 43
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 44
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 45
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 46
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 47
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 48
+
+#define ED_NUM_CHECKBUTTONS 49
#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
#define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
/* values for elements with score for certain actions */
#define MIN_SCORE 0
-#define MAX_SCORE 255
+#define MAX_SCORE 999
/* values for elements with count for collecting */
#define MIN_COLLECT_COUNT 0
-#define MAX_COLLECT_COUNT 255
+#define MAX_COLLECT_COUNT 999
/* values for random placement */
#define RANDOM_USE_PERCENTAGE 0
},
{
ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(9),
- 0, 255,
+ 0, 999,
GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP,
GADGET_ID_LEVEL_TIMESCORE_TEXT, GADGET_ID_NONE,
&level.score[SC_TIME_BONUS],
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",
},
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(7),
- 0, 255,
+ 0, 999,
GADGET_ID_PUSH_DELAY_FIX_DOWN, GADGET_ID_PUSH_DELAY_FIX_UP,
GADGET_ID_PUSH_DELAY_FIX_TEXT, GADGET_ID_NONE,
&custom_element.push_delay_fixed,
},
{
-1, ED_ELEMENT_SETTINGS_YPOS(7),
- 0, 255,
+ 0, 999,
GADGET_ID_PUSH_DELAY_RND_DOWN, GADGET_ID_PUSH_DELAY_RND_UP,
GADGET_ID_PUSH_DELAY_RND_TEXT, GADGET_ID_PUSH_DELAY_FIX_UP,
&custom_element.push_delay_random,
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(8),
- 0, 255,
+ 0, 999,
GADGET_ID_DROP_DELAY_FIX_DOWN, GADGET_ID_DROP_DELAY_FIX_UP,
GADGET_ID_DROP_DELAY_FIX_TEXT, GADGET_ID_NONE,
&custom_element.drop_delay_fixed,
},
{
-1, ED_ELEMENT_SETTINGS_YPOS(8),
- 0, 255,
+ 0, 999,
GADGET_ID_DROP_DELAY_RND_DOWN, GADGET_ID_DROP_DELAY_RND_UP,
GADGET_ID_DROP_DELAY_RND_TEXT, GADGET_ID_DROP_DELAY_FIX_UP,
&custom_element.drop_delay_random,
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(12),
- 0, 255,
+ 0, 999,
GADGET_ID_EXPLOSION_DELAY_DOWN, GADGET_ID_EXPLOSION_DELAY_UP,
GADGET_ID_EXPLOSION_DELAY_TEXT, GADGET_ID_NONE,
&custom_element.explosion_delay,
},
{
ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13),
- 0, 255,
+ 0, 999,
GADGET_ID_IGNITION_DELAY_DOWN, GADGET_ID_IGNITION_DELAY_UP,
GADGET_ID_IGNITION_DELAY_TEXT, GADGET_ID_NONE,
&custom_element.ignition_delay,
} 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"
}
};
/* ---------- element settings: configure (several elements) ------------- */
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6),
GADGET_ID_PLAYER_SPEED, GADGET_ID_NONE,
-1,
options_player_speed,
int gd_x, gd_y;
int x, y;
int width, height;
+ int wheel_x, wheel_y;
+ int wheel_width, wheel_height;
int type;
int gadget_id;
char *infotext;
ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS,
SX + ED_SCROLL_HORIZONTAL_XPOS, SY + ED_SCROLL_HORIZONTAL_YPOS,
ED_SCROLL_HORIZONTAL_XSIZE, ED_SCROLL_HORIZONTAL_YSIZE,
+#if 1
+ SX, SY,
+ SXSIZE, SYSIZE,
+#else
+ 0, 0,
+ SX + SXSIZE + SX, WIN_YSIZE,
+#endif
GD_TYPE_SCROLLBAR_HORIZONTAL,
GADGET_ID_SCROLL_HORIZONTAL,
"scroll level editing area horizontally"
ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS,
SX + ED_SCROLL_VERTICAL_XPOS, SY + ED_SCROLL_VERTICAL_YPOS,
ED_SCROLL_VERTICAL_XSIZE, ED_SCROLL_VERTICAL_YSIZE,
+#if 1
+ SX, SY,
+ SXSIZE, SYSIZE,
+#else
+ 0, 0,
+ SX + SXSIZE + SX, WIN_YSIZE,
+#endif
GD_TYPE_SCROLLBAR_VERTICAL,
GADGET_ID_SCROLL_VERTICAL,
"scroll level editing area vertically"
ED_SCROLLBAR2_XPOS, ED_SCROLLBAR2_YPOS,
DX + ED_SCROLL2_VERTICAL_XPOS, DY + ED_SCROLL2_VERTICAL_YPOS,
ED_SCROLL2_VERTICAL_XSIZE, ED_SCROLL2_VERTICAL_YSIZE,
+#if 1
+ DX, DY,
+ DXSIZE, DYSIZE,
+#else
+ SX + SXSIZE + SX, 0,
+ WIN_XSIZE - (SX + SXSIZE + SX), WIN_YSIZE,
+#endif
GD_TYPE_SCROLLBAR_VERTICAL,
GADGET_ID_SCROLL_LIST_VERTICAL,
"scroll element list vertically"
GADGET_ID_EM_SLIPPERY_GEMS, GADGET_ID_NONE,
&level.em_slippery_gems,
NULL,
- "slip down from certain flat walls","use EM style slipping behaviour"
+ "slip down from certain flat walls","use EM/DC style slipping behaviour"
},
{
ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2),
"can grow into anything diggable", "grow into more than just sand"
},
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
GADGET_ID_CONTINUOUS_SNAPPING, GADGET_ID_NONE,
&level.continuous_snapping,
NULL,
"continuos snapping", "use snapping without releasing key"
},
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7),
GADGET_ID_BLOCK_SNAP_FIELD, GADGET_ID_NONE,
&level.block_snap_field,
NULL,
"no scrolling when relocating", "player gets relocated without delay"
},
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
+ GADGET_ID_SHIFTED_RELOCATION, GADGET_ID_NONE,
+ &level.shifted_relocation,
+ NULL,
+ "no centering when relocating", "level not centered after relocation"
+ },
+ {
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
GADGET_ID_USE_START_ELEMENT, GADGET_ID_NONE,
&level.use_start_element[0],
NULL,
"use level start element:", "start level at this element's position"
},
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
GADGET_ID_USE_ARTWORK_ELEMENT, GADGET_ID_NONE,
&level.use_artwork_element[0],
NULL,
"use artwork from element:", "use player artwork from other element"
},
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11),
GADGET_ID_USE_EXPLOSION_ELEMENT, GADGET_ID_NONE,
&level.use_explosion_element[0],
NULL,
"use explosion from element:", "use explosion properties from element"
},
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(12),
GADGET_ID_INITIAL_GRAVITY, GADGET_ID_NONE,
&level.initial_player_gravity[0],
NULL,
"use initial gravity", "set initial player gravity"
},
{
- ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4),
+ ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5),
GADGET_ID_CAN_PASS_TO_WALKABLE, GADGET_ID_NONE,
&level.can_pass_to_walkable,
NULL,
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"
},
};
/* ---------- level start element ---------------------------------------- */
{
- -1, ED_AREA_1X1_SETTINGS_YPOS(8),
+ -1, ED_AREA_1X1_SETTINGS_YPOS(9),
GADGET_ID_START_ELEMENT, GADGET_ID_USE_START_ELEMENT,
&level.start_element[0], 1, 1,
NULL, NULL, NULL, "level start element"
/* ---------- player artwork element ------------------------------------- */
{
- -1, ED_AREA_1X1_SETTINGS_YPOS(9),
+ -1, ED_AREA_1X1_SETTINGS_YPOS(10),
GADGET_ID_ARTWORK_ELEMENT, GADGET_ID_USE_ARTWORK_ELEMENT,
&level.artwork_element[0], 1, 1,
NULL, NULL, NULL, "element for player artwork"
/* ---------- player explosion element ----------------------------------- */
{
- -1, ED_AREA_1X1_SETTINGS_YPOS(10),
+ -1, ED_AREA_1X1_SETTINGS_YPOS(11),
GADGET_ID_EXPLOSION_ELEMENT, GADGET_ID_USE_EXPLOSION_ELEMENT,
&level.explosion_element[0], 1, 1,
NULL, NULL, NULL, "element for player explosion"
/* 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;
EL_CHAR('B'),
EL_CHAR('D'),
EL_EMPTY,
-
-#if 0
- EL_CHAR('B'),
- EL_CHAR('O'),
- EL_CHAR('U'),
- EL_CHAR('L'),
-
- EL_CHAR('-'),
- EL_CHAR('D'),
- EL_CHAR('E'),
- EL_CHAR('R'),
-
- EL_CHAR('D'),
- EL_CHAR('A'),
- EL_CHAR('S'),
- EL_CHAR('H'),
-#endif
};
static int editor_el_boulderdash[] =
{
-#if 1
EL_EMPTY,
EL_SAND,
EL_BD_ROCK,
EL_BD_BUTTERFLY_DOWN,
EL_BD_FIREFLY_DOWN,
EL_EXIT_OPEN,
-
-#else
-
- EL_PLAYER_1,
- EL_EMPTY,
- EL_SAND,
- EL_STEELWALL,
-
- EL_BD_WALL,
- EL_BD_MAGIC_WALL,
- EL_EXIT_CLOSED,
- EL_EXIT_OPEN,
-
- EL_BD_DIAMOND,
- EL_BD_BUTTERFLY_UP,
- EL_BD_FIREFLY_UP,
- EL_BD_ROCK,
-
- EL_BD_BUTTERFLY_LEFT,
- EL_BD_FIREFLY_LEFT,
- EL_BD_BUTTERFLY_RIGHT,
- EL_BD_FIREFLY_RIGHT,
-
- EL_BD_AMOEBA,
- EL_BD_BUTTERFLY_DOWN,
- EL_BD_FIREFLY_DOWN,
- EL_BD_EXPANDABLE_WALL,
-#endif
};
static int *editor_hl_boulderdash_ptr = editor_hl_boulderdash;
static int *editor_el_boulderdash_ptr = editor_el_boulderdash;
EL_CHAR('E'),
EL_CHAR('M'),
EL_EMPTY,
-
-#if 0
- EL_CHAR('E'),
- EL_CHAR('M'),
- EL_CHAR('E'),
- EL_CHAR('-'),
-
- EL_CHAR('R'),
- EL_CHAR('A'),
- EL_CHAR('L'),
- EL_CHAR('D'),
-
- EL_CHAR('M'),
- EL_CHAR('I'),
- EL_CHAR('N'),
- EL_CHAR('E'),
-#endif
};
static int editor_el_emerald_mine[] =
{
-#if 1
EL_SAND,
EL_ROCK,
EL_QUICKSAND_EMPTY,
EL_EM_GATE_3_GRAY,
EL_EM_GATE_4_GRAY,
-#else
-
- EL_PLAYER_1,
- EL_PLAYER_2,
- EL_SAND,
- EL_ROCK,
-
- EL_STEELWALL,
- EL_WALL,
- EL_WALL_SLIPPERY,
- EL_MAGIC_WALL,
-
- EL_EMERALD,
- EL_DIAMOND,
- EL_NUT,
- EL_BOMB,
-
- EL_WALL_EMERALD,
- EL_WALL_DIAMOND,
- EL_QUICKSAND_EMPTY,
- EL_QUICKSAND_FULL,
-
- EL_DYNAMITE,
- EL_DYNAMITE_ACTIVE,
- EL_EXIT_CLOSED,
- EL_EXIT_OPEN,
-
- EL_YAMYAM,
- EL_BUG_UP,
- EL_SPACESHIP_UP,
- EL_ROBOT,
-
- EL_BUG_LEFT,
- EL_SPACESHIP_LEFT,
- EL_BUG_RIGHT,
- EL_SPACESHIP_RIGHT,
-
- EL_ROBOT_WHEEL,
- EL_BUG_DOWN,
- EL_SPACESHIP_DOWN,
- EL_INVISIBLE_WALL,
-
- EL_ACID_POOL_TOPLEFT,
- EL_ACID,
- EL_ACID_POOL_TOPRIGHT,
- EL_EMPTY,
-
- EL_ACID_POOL_BOTTOMLEFT,
- EL_ACID_POOL_BOTTOM,
- EL_ACID_POOL_BOTTOMRIGHT,
- EL_EMPTY,
-
- EL_AMOEBA_DROP,
- EL_AMOEBA_DEAD,
- EL_AMOEBA_WET,
- EL_AMOEBA_DRY,
-
- EL_EM_KEY_1,
- EL_EM_KEY_2,
- EL_EM_KEY_3,
- EL_EM_KEY_4,
-
- EL_EM_GATE_1,
- EL_EM_GATE_2,
- EL_EM_GATE_3,
- EL_EM_GATE_4,
-
- EL_EM_GATE_1_GRAY,
- EL_EM_GATE_2_GRAY,
- EL_EM_GATE_3_GRAY,
- EL_EM_GATE_4_GRAY,
-#endif
+ EL_EM_EXIT_CLOSED,
+ EL_EM_EXIT_OPEN,
+ EL_EM_STEEL_EXIT_CLOSED,
+ EL_EM_STEEL_EXIT_OPEN,
};
static int *editor_hl_emerald_mine_ptr = editor_hl_emerald_mine;
static int *editor_el_emerald_mine_ptr = editor_el_emerald_mine;
EL_CHAR('E'),
EL_CHAR('M'),
EL_CHAR('C'),
-
-#if 0
- EL_CHAR('E'),
- EL_CHAR('M'),
- EL_CHAR('E'),
- EL_CHAR('-'),
-
- EL_CHAR('R'),
- EL_CHAR('A'),
- EL_CHAR('L'),
- EL_CHAR('D'),
-
- EL_CHAR('M'),
- EL_CHAR('I'),
- EL_CHAR('N'),
- EL_CHAR('E'),
-
- EL_CHAR('C'),
- EL_CHAR('L'),
- EL_CHAR('U'),
- EL_CHAR('B'),
-#endif
};
static int editor_el_emerald_mine_club[] =
{
-#if 1
EL_EMC_KEY_5,
EL_EMC_KEY_6,
EL_EMC_KEY_7,
EL_YAMYAM_DOWN,
EL_BALLOON_SWITCH_DOWN,
EL_BALLOON_SWITCH_NONE,
+};
+static int *editor_hl_emerald_mine_club_ptr = editor_hl_emerald_mine_club;
+static int *editor_el_emerald_mine_club_ptr = editor_el_emerald_mine_club;
+static int num_editor_hl_emerald_mine_club=SIZEOF_ARRAY_INT(editor_hl_emerald_mine_club);
+static int num_editor_el_emerald_mine_club=SIZEOF_ARRAY_INT(editor_el_emerald_mine_club);
-#else
-
- EL_EMC_KEY_5,
- EL_EMC_KEY_6,
- EL_EMC_KEY_7,
- EL_EMC_KEY_8,
-
- EL_EMC_GATE_5,
- EL_EMC_GATE_6,
- EL_EMC_GATE_7,
- EL_EMC_GATE_8,
-
- EL_EMC_GATE_5_GRAY,
- EL_EMC_GATE_6_GRAY,
- EL_EMC_GATE_7_GRAY,
- EL_EMC_GATE_8_GRAY,
-
- EL_EMC_STEELWALL_1,
- EL_EMC_STEELWALL_2,
- EL_EMC_STEELWALL_3,
- EL_EMC_STEELWALL_4,
-
- EL_EMC_WALL_13,
- EL_EMC_WALL_14,
- EL_EMC_WALL_15,
- EL_EMC_WALL_16,
-
- EL_EMC_WALL_SLIPPERY_1,
- EL_EMC_WALL_SLIPPERY_2,
- EL_EMC_WALL_SLIPPERY_3,
- EL_EMC_WALL_SLIPPERY_4,
-
- EL_EMC_WALL_1,
- EL_EMC_WALL_2,
- EL_EMC_WALL_3,
- EL_EMC_WALL_4,
-
- EL_EMC_WALL_5,
- EL_EMC_WALL_6,
- EL_EMC_WALL_7,
- EL_EMC_WALL_8,
-
- EL_EMC_WALL_9,
- EL_EMC_WALL_10,
- EL_EMC_WALL_11,
- EL_EMC_WALL_12,
-
- EL_EMC_ANDROID,
- EL_BALLOON,
- EL_BALLOON_SWITCH_ANY,
- EL_BALLOON_SWITCH_NONE,
-
- EL_BALLOON_SWITCH_LEFT,
- EL_BALLOON_SWITCH_RIGHT,
- EL_BALLOON_SWITCH_UP,
- EL_BALLOON_SWITCH_DOWN,
-
- EL_EMC_GRASS,
- EL_EMC_PLANT,
- EL_EMC_LENSES,
- EL_EMC_MAGNIFIER,
-
- EL_EMC_MAGIC_BALL,
- EL_EMC_MAGIC_BALL_SWITCH,
- EL_SPRING,
- EL_EMC_SPRING_BUMPER,
-
- EL_EMC_DRIPPER,
- EL_EMC_FAKE_GRASS,
- EL_EMPTY,
- EL_EMPTY,
-
- EL_EM_DYNAMITE,
- EL_EM_DYNAMITE_ACTIVE,
- EL_EMPTY,
- EL_EMPTY,
-
- EL_YAMYAM_LEFT,
- EL_YAMYAM_RIGHT,
- EL_YAMYAM_UP,
- EL_YAMYAM_DOWN,
-#endif
-};
-static int *editor_hl_emerald_mine_club_ptr = editor_hl_emerald_mine_club;
-static int *editor_el_emerald_mine_club_ptr = editor_el_emerald_mine_club;
-static int num_editor_hl_emerald_mine_club=SIZEOF_ARRAY_INT(editor_hl_emerald_mine_club);
-static int num_editor_el_emerald_mine_club=SIZEOF_ARRAY_INT(editor_el_emerald_mine_club);
-
-static int editor_hl_rnd[] =
-{
- EL_INTERNAL_CASCADE_RND_ACTIVE,
- EL_CHAR('R'),
- EL_CHAR('N'),
- EL_CHAR('D'),
-
-#if 0
- EL_CHAR('M'),
- EL_CHAR('O'),
- EL_CHAR('R'),
- EL_CHAR('E'),
-#endif
-};
+static int editor_hl_rnd[] =
+{
+ EL_INTERNAL_CASCADE_RND_ACTIVE,
+ EL_CHAR('R'),
+ EL_CHAR('N'),
+ EL_CHAR('D'),
+};
static int editor_el_rnd[] =
{
-#if 1
EL_KEY_1,
EL_KEY_2,
EL_KEY_3,
EL_EXPANDABLE_WALL_HORIZONTAL,
EL_EXPANDABLE_WALL_VERTICAL,
EL_EXPANDABLE_WALL_ANY,
-
-#else
-
- EL_KEY_1,
- EL_KEY_2,
- EL_KEY_3,
- EL_KEY_4,
-
- EL_GATE_1,
- EL_GATE_2,
- EL_GATE_3,
- EL_GATE_4,
-
- EL_GATE_1_GRAY,
- EL_GATE_2_GRAY,
- EL_GATE_3_GRAY,
- EL_GATE_4_GRAY,
-
- EL_ARROW_LEFT,
- EL_ARROW_RIGHT,
- EL_ARROW_UP,
- EL_ARROW_DOWN,
-
- EL_AMOEBA_DEAD,
- EL_AMOEBA_DRY,
- EL_AMOEBA_FULL,
- EL_EMPTY,
-
- EL_EMPTY,
- EL_EMERALD_YELLOW,
- EL_EMERALD_RED,
- EL_EMERALD_PURPLE,
-
- EL_WALL_BD_DIAMOND,
- EL_WALL_EMERALD_YELLOW,
- EL_WALL_EMERALD_RED,
- EL_WALL_EMERALD_PURPLE,
-
- EL_GAME_OF_LIFE,
- EL_PACMAN_UP,
- EL_TIME_ORB_FULL,
- EL_TIME_ORB_EMPTY,
-
- EL_PACMAN_LEFT,
- EL_DARK_YAMYAM,
- EL_PACMAN_RIGHT,
- EL_EXPANDABLE_WALL,
-
- EL_BIOMAZE,
- EL_PACMAN_DOWN,
- EL_LAMP,
- EL_LAMP_ACTIVE,
-
- EL_DYNABOMB_INCREASE_NUMBER,
- EL_DYNABOMB_INCREASE_SIZE,
- EL_DYNABOMB_INCREASE_POWER,
- EL_STONEBLOCK,
-
- EL_MOLE,
- EL_PENGUIN,
- EL_PIG,
- EL_DRAGON,
-
- EL_BUG,
- EL_MOLE_UP,
- EL_BD_BUTTERFLY,
- EL_BD_FIREFLY,
-
- EL_MOLE_LEFT,
- EL_EMPTY,
- EL_MOLE_RIGHT,
- EL_PACMAN,
-
- EL_SPACESHIP,
- EL_MOLE_DOWN,
- EL_EMPTY,
- EL_EMPTY,
-
- EL_SATELLITE,
- EL_EXPANDABLE_WALL_HORIZONTAL,
- EL_EXPANDABLE_WALL_VERTICAL,
- EL_EXPANDABLE_WALL_ANY,
-
- EL_INVISIBLE_STEELWALL,
- EL_INVISIBLE_WALL,
- EL_SPEED_PILL,
- EL_BLACK_ORB,
-#endif
};
static int *editor_hl_rnd_ptr = editor_hl_rnd;
static int *editor_el_rnd_ptr = editor_el_rnd;
EL_CHAR('S'),
EL_CHAR('B'),
EL_EMPTY,
-
-#if 0
- EL_CHAR('S'),
- EL_CHAR('O'),
- EL_CHAR('K'),
- EL_CHAR('O'),
-
- EL_CHAR('-'),
- EL_CHAR('B'),
- EL_CHAR('A'),
- EL_CHAR('N'),
-#endif
};
static int editor_el_sokoban[] =
EL_CHAR('S'),
EL_CHAR('P'),
EL_EMPTY,
-
-#if 0
- EL_CHAR('S'),
- EL_CHAR('U'),
- EL_CHAR('P'),
- EL_CHAR('A'),
-
- EL_CHAR('P'),
- EL_CHAR('L'),
- EL_CHAR('E'),
- EL_CHAR('X'),
-#endif
};
static int editor_el_supaplex[] =
{
-#if 1
EL_SP_MURPHY,
EL_EMPTY,
EL_SP_BASE,
EL_SP_CHIP_LEFT,
EL_SP_CHIP_RIGHT,
EL_SP_CHIP_BOTTOM,
+};
+static int *editor_hl_supaplex_ptr = editor_hl_supaplex;
+static int *editor_el_supaplex_ptr = editor_el_supaplex;
+static int num_editor_hl_supaplex = SIZEOF_ARRAY_INT(editor_hl_supaplex);
+static int num_editor_el_supaplex = SIZEOF_ARRAY_INT(editor_el_supaplex);
-#else
+static int editor_hl_diamond_caves[] =
+{
+ EL_INTERNAL_CASCADE_DC_ACTIVE,
+ EL_CHAR('D'),
+ EL_CHAR('C'),
+ EL_CHAR('2'),
+};
-#if 1
- EL_EMPTY,
-#else
- EL_SP_EMPTY,
-#endif
- EL_SP_ZONK,
- EL_SP_BASE,
- EL_SP_MURPHY,
+static int editor_el_diamond_caves[] =
+{
+ EL_PEARL,
+ EL_CRYSTAL,
+ EL_WALL_PEARL,
+ EL_WALL_CRYSTAL,
- EL_SP_INFOTRON,
- EL_SP_CHIP_SINGLE,
- EL_SP_HARDWARE_GRAY,
- EL_SP_EXIT_CLOSED,
+ EL_CONVEYOR_BELT_1_LEFT,
+ EL_CONVEYOR_BELT_1_MIDDLE,
+ EL_CONVEYOR_BELT_1_RIGHT,
+ EL_CONVEYOR_BELT_1_SWITCH_MIDDLE,
- EL_SP_DISK_ORANGE,
- EL_SP_PORT_RIGHT,
- EL_SP_PORT_DOWN,
- EL_SP_PORT_LEFT,
-
- EL_SP_PORT_UP,
- EL_SP_GRAVITY_PORT_RIGHT,
- EL_SP_GRAVITY_PORT_DOWN,
- EL_SP_GRAVITY_PORT_LEFT,
-
- EL_SP_GRAVITY_PORT_UP,
- EL_SP_SNIKSNAK,
- EL_SP_DISK_YELLOW,
- EL_SP_TERMINAL,
-
- EL_SP_DISK_RED,
- EL_SP_PORT_VERTICAL,
- EL_SP_PORT_HORIZONTAL,
- EL_SP_PORT_ANY,
-
- EL_SP_ELECTRON,
- EL_SP_BUGGY_BASE,
- EL_SP_CHIP_LEFT,
- EL_SP_CHIP_RIGHT,
-
- EL_SP_HARDWARE_BASE_1,
- EL_SP_HARDWARE_GREEN,
- EL_SP_HARDWARE_BLUE,
- EL_SP_HARDWARE_RED,
-
- EL_SP_HARDWARE_YELLOW,
- EL_SP_HARDWARE_BASE_2,
- EL_SP_HARDWARE_BASE_3,
- EL_SP_HARDWARE_BASE_4,
-
- EL_SP_HARDWARE_BASE_5,
- EL_SP_HARDWARE_BASE_6,
- EL_SP_CHIP_TOP,
- EL_SP_CHIP_BOTTOM,
-#endif
-};
-static int *editor_hl_supaplex_ptr = editor_hl_supaplex;
-static int *editor_el_supaplex_ptr = editor_el_supaplex;
-static int num_editor_hl_supaplex = SIZEOF_ARRAY_INT(editor_hl_supaplex);
-static int num_editor_el_supaplex = SIZEOF_ARRAY_INT(editor_el_supaplex);
-
-static int editor_hl_diamond_caves[] =
-{
- EL_INTERNAL_CASCADE_DC_ACTIVE,
- EL_CHAR('D'),
- EL_CHAR('C'),
- EL_CHAR('2'),
-
-#if 0
- EL_CHAR('D'),
- EL_CHAR('I'),
- EL_CHAR('A'),
- EL_CHAR('-'),
-
- EL_CHAR('M'),
- EL_CHAR('O'),
- EL_CHAR('N'),
- EL_CHAR('D'),
-
- EL_CHAR('C'),
- EL_CHAR('A'),
- EL_CHAR('V'),
- EL_CHAR('E'),
-
- EL_CHAR('S'),
- EL_CHAR(' '),
- EL_CHAR('I'),
- EL_CHAR('I'),
-#endif
-};
-
-static int editor_el_diamond_caves[] =
-{
-#if 1
- EL_PEARL,
- EL_CRYSTAL,
- EL_WALL_PEARL,
- EL_WALL_CRYSTAL,
-
- EL_CONVEYOR_BELT_1_LEFT,
- EL_CONVEYOR_BELT_1_MIDDLE,
- EL_CONVEYOR_BELT_1_RIGHT,
- EL_CONVEYOR_BELT_1_SWITCH_MIDDLE,
-
- EL_CONVEYOR_BELT_2_LEFT,
- EL_CONVEYOR_BELT_2_MIDDLE,
- EL_CONVEYOR_BELT_2_RIGHT,
- EL_CONVEYOR_BELT_2_SWITCH_MIDDLE,
+ EL_CONVEYOR_BELT_2_LEFT,
+ EL_CONVEYOR_BELT_2_MIDDLE,
+ EL_CONVEYOR_BELT_2_RIGHT,
+ EL_CONVEYOR_BELT_2_SWITCH_MIDDLE,
EL_CONVEYOR_BELT_3_LEFT,
EL_CONVEYOR_BELT_3_MIDDLE,
EL_CONVEYOR_BELT_3_SWITCH_RIGHT,
EL_CONVEYOR_BELT_4_SWITCH_RIGHT,
+ EL_TIMEGATE_CLOSED,
+ EL_TIMEGATE_OPEN,
+ EL_TIMEGATE_SWITCH,
+ EL_DC_TIMEGATE_SWITCH,
+
EL_SWITCHGATE_CLOSED,
EL_SWITCHGATE_OPEN,
EL_SWITCHGATE_SWITCH_UP,
EL_SWITCHGATE_SWITCH_DOWN,
- EL_TIMEGATE_CLOSED,
- EL_TIMEGATE_OPEN,
- EL_TIMEGATE_SWITCH,
- EL_EMPTY,
-
- EL_SIGN_EXCLAMATION,
- EL_SIGN_STOP,
EL_LIGHT_SWITCH,
EL_LIGHT_SWITCH_ACTIVE,
+ EL_DC_SWITCHGATE_SWITCH_UP,
+ EL_DC_SWITCHGATE_SWITCH_DOWN,
+ EL_STEEL_EXIT_CLOSED,
+ EL_STEEL_EXIT_OPEN,
EL_STEELWALL_SLIPPERY,
EL_INVISIBLE_SAND,
+
+ EL_QUICKSAND_FAST_EMPTY,
+ EL_QUICKSAND_FAST_FULL,
EL_LANDMINE,
- EL_EMPTY,
+ EL_DC_LANDMINE,
EL_SHIELD_NORMAL,
EL_SHIELD_DEADLY,
EL_EXTRA_TIME,
- EL_EMPTY,
+ EL_DC_MAGIC_WALL,
EL_ENVELOPE_1,
EL_ENVELOPE_2,
EL_ENVELOPE_3,
EL_ENVELOPE_4,
-#else
-
- EL_PEARL,
- EL_CRYSTAL,
- EL_WALL_PEARL,
- EL_WALL_CRYSTAL,
+ EL_SIGN_RADIOACTIVITY,
+ EL_SIGN_WHEELCHAIR,
+ EL_SIGN_PARKING,
+ EL_SIGN_NO_ENTRY,
- EL_CONVEYOR_BELT_1_LEFT,
- EL_CONVEYOR_BELT_1_MIDDLE,
- EL_CONVEYOR_BELT_1_RIGHT,
- EL_CONVEYOR_BELT_1_SWITCH_MIDDLE,
+ EL_SIGN_GIVE_WAY,
+ EL_SIGN_ENTRY_FORBIDDEN,
+ EL_SIGN_EMERGENCY_EXIT,
+ EL_SIGN_YIN_YANG,
- EL_CONVEYOR_BELT_2_LEFT,
- EL_CONVEYOR_BELT_2_MIDDLE,
- EL_CONVEYOR_BELT_2_RIGHT,
- EL_CONVEYOR_BELT_2_SWITCH_MIDDLE,
+#if 0
+ EL_SIGN_SPERMS,
+ EL_SIGN_BULLET,
+ EL_SIGN_HEART,
+ EL_SIGN_CROSS,
- EL_CONVEYOR_BELT_3_LEFT,
- EL_CONVEYOR_BELT_3_MIDDLE,
- EL_CONVEYOR_BELT_3_RIGHT,
- EL_CONVEYOR_BELT_3_SWITCH_MIDDLE,
+ EL_SIGN_FRANKIE,
+ EL_EMPTY,
+ EL_EMPTY,
+ EL_EMPTY,
- EL_CONVEYOR_BELT_4_LEFT,
- EL_CONVEYOR_BELT_4_MIDDLE,
- EL_CONVEYOR_BELT_4_RIGHT,
- EL_CONVEYOR_BELT_4_SWITCH_MIDDLE,
+ EL_SPERMS,
+ EL_BULLET,
+ EL_HEART,
+ EL_CROSS,
- EL_CONVEYOR_BELT_1_SWITCH_LEFT,
- EL_CONVEYOR_BELT_2_SWITCH_LEFT,
- EL_CONVEYOR_BELT_3_SWITCH_LEFT,
- EL_CONVEYOR_BELT_4_SWITCH_LEFT,
+ EL_FRANKIE,
+ EL_EMPTY,
+ EL_EMPTY,
+ EL_EMPTY,
+#endif
- EL_CONVEYOR_BELT_1_SWITCH_RIGHT,
- EL_CONVEYOR_BELT_2_SWITCH_RIGHT,
- EL_CONVEYOR_BELT_3_SWITCH_RIGHT,
- EL_CONVEYOR_BELT_4_SWITCH_RIGHT,
+ EL_DC_STEELWALL_2_SINGLE,
+ EL_DC_STEELWALL_2_TOP,
+ EL_SIGN_EXCLAMATION,
+ EL_SIGN_STOP,
- EL_SWITCHGATE_OPEN,
- EL_SWITCHGATE_CLOSED,
- EL_SWITCHGATE_SWITCH_UP,
- EL_SWITCHGATE_SWITCH_DOWN,
+ EL_DC_STEELWALL_2_LEFT,
+ EL_DC_STEELWALL_2_MIDDLE,
+ EL_DC_STEELWALL_2_HORIZONTAL,
+ EL_DC_STEELWALL_2_RIGHT,
- EL_ENVELOPE_1,
- EL_ENVELOPE_2,
- EL_ENVELOPE_3,
- EL_ENVELOPE_4,
+ EL_DC_STEELWALL_1_TOPLEFT,
+ EL_DC_STEELWALL_2_VERTICAL,
+ EL_DC_STEELWALL_1_TOPRIGHT,
+ EL_DC_GATE_WHITE,
- EL_TIMEGATE_CLOSED,
- EL_TIMEGATE_OPEN,
- EL_TIMEGATE_SWITCH,
- EL_EMPTY,
+ EL_DC_STEELWALL_1_VERTICAL,
+ EL_DC_STEELWALL_2_BOTTOM,
+ EL_DC_KEY_WHITE,
+ EL_DC_GATE_WHITE_GRAY,
- EL_LANDMINE,
- EL_INVISIBLE_SAND,
- EL_STEELWALL_SLIPPERY,
- EL_EMPTY,
+ EL_DC_STEELWALL_1_BOTTOMLEFT,
+ EL_DC_STEELWALL_1_HORIZONTAL,
+ EL_DC_STEELWALL_1_BOTTOMRIGHT,
+ EL_DC_GATE_FAKE_GRAY,
- EL_SIGN_EXCLAMATION,
- EL_SIGN_STOP,
- EL_LIGHT_SWITCH,
- EL_LIGHT_SWITCH_ACTIVE,
+ EL_DC_STEELWALL_1_BOTTOMRIGHT_2,
+ EL_DC_STEELWALL_1_BOTTOM,
+ EL_DC_STEELWALL_1_BOTTOMLEFT_2,
+ EL_EXPANDABLE_STEELWALL_HORIZONTAL,
- EL_SHIELD_NORMAL,
- EL_SHIELD_DEADLY,
- EL_EXTRA_TIME,
+ EL_DC_STEELWALL_1_RIGHT,
EL_EMPTY,
+ EL_DC_STEELWALL_1_LEFT,
+ EL_EXPANDABLE_STEELWALL_VERTICAL,
-#endif
+ EL_DC_STEELWALL_1_TOPRIGHT_2,
+ EL_DC_STEELWALL_1_TOP,
+ EL_DC_STEELWALL_1_TOPLEFT_2,
+ EL_EXPANDABLE_STEELWALL_ANY,
};
static int *editor_hl_diamond_caves_ptr = editor_hl_diamond_caves;
static int *editor_el_diamond_caves_ptr = editor_el_diamond_caves;
EL_CHAR('D'),
EL_CHAR('X'),
EL_EMPTY,
-
-#if 0
- EL_CHAR('D'),
- EL_CHAR('X'),
- EL_CHAR('-'),
- EL_CHAR(' '),
-
- EL_CHAR('B'),
- EL_CHAR('O'),
- EL_CHAR('U'),
- EL_CHAR('L'),
-
- EL_CHAR('-'),
- EL_CHAR('D'),
- EL_CHAR('E'),
- EL_CHAR('R'),
-
- EL_CHAR('D'),
- EL_CHAR('A'),
- EL_CHAR('S'),
- EL_CHAR('H'),
-#endif
};
static int editor_el_dx_boulderdash[] =
EL_CHAR('T'),
EL_CHAR('X'),
EL_CHAR('T'),
-
-#if 0
- EL_CHAR('T'),
- EL_CHAR('E'),
- EL_CHAR('X'),
- EL_CHAR('T'),
-#endif
};
static int editor_el_chars[] =
EL_CHAR('°'),
EL_CHAR('®'),
EL_CHAR(FONT_ASCII_CURSOR),
+ EL_CHAR(FONT_ASCII_BUTTON),
+
+ EL_CHAR(FONT_ASCII_UP),
+ EL_CHAR(FONT_ASCII_DOWN),
+ EL_CHAR(' '),
EL_CHAR(' ')
};
static int *editor_hl_chars_ptr = editor_hl_chars;
static int num_editor_hl_chars = SIZEOF_ARRAY_INT(editor_hl_chars);
static int num_editor_el_chars = SIZEOF_ARRAY_INT(editor_el_chars);
+static int editor_hl_steel_chars[] =
+{
+ EL_INTERNAL_CASCADE_STEEL_CHARS_ACTIVE,
+ EL_STEEL_CHAR('T'),
+ EL_STEEL_CHAR('X'),
+ EL_STEEL_CHAR('T'),
+};
+
+static int editor_el_steel_chars[] =
+{
+ EL_STEEL_CHAR(' '),
+ EL_STEEL_CHAR('!'),
+ EL_STEEL_CHAR('"'),
+ EL_STEEL_CHAR('#'),
+
+ EL_STEEL_CHAR('$'),
+ EL_STEEL_CHAR('%'),
+ EL_STEEL_CHAR('&'),
+ EL_STEEL_CHAR('\''),
+
+ EL_STEEL_CHAR('('),
+ EL_STEEL_CHAR(')'),
+ EL_STEEL_CHAR('*'),
+ EL_STEEL_CHAR('+'),
+
+ EL_STEEL_CHAR(','),
+ EL_STEEL_CHAR('-'),
+ EL_STEEL_CHAR('.'),
+ EL_STEEL_CHAR('/'),
+
+ EL_STEEL_CHAR('0'),
+ EL_STEEL_CHAR('1'),
+ EL_STEEL_CHAR('2'),
+ EL_STEEL_CHAR('3'),
+
+ EL_STEEL_CHAR('4'),
+ EL_STEEL_CHAR('5'),
+ EL_STEEL_CHAR('6'),
+ EL_STEEL_CHAR('7'),
+
+ EL_STEEL_CHAR('8'),
+ EL_STEEL_CHAR('9'),
+ EL_STEEL_CHAR(':'),
+ EL_STEEL_CHAR(';'),
+
+ EL_STEEL_CHAR('<'),
+ EL_STEEL_CHAR('='),
+ EL_STEEL_CHAR('>'),
+ EL_STEEL_CHAR('?'),
+
+ EL_STEEL_CHAR('@'),
+ EL_STEEL_CHAR('A'),
+ EL_STEEL_CHAR('B'),
+ EL_STEEL_CHAR('C'),
+
+ EL_STEEL_CHAR('D'),
+ EL_STEEL_CHAR('E'),
+ EL_STEEL_CHAR('F'),
+ EL_STEEL_CHAR('G'),
+
+ EL_STEEL_CHAR('H'),
+ EL_STEEL_CHAR('I'),
+ EL_STEEL_CHAR('J'),
+ EL_STEEL_CHAR('K'),
+
+ EL_STEEL_CHAR('L'),
+ EL_STEEL_CHAR('M'),
+ EL_STEEL_CHAR('N'),
+ EL_STEEL_CHAR('O'),
+
+ EL_STEEL_CHAR('P'),
+ EL_STEEL_CHAR('Q'),
+ EL_STEEL_CHAR('R'),
+ EL_STEEL_CHAR('S'),
+
+ EL_STEEL_CHAR('T'),
+ EL_STEEL_CHAR('U'),
+ EL_STEEL_CHAR('V'),
+ EL_STEEL_CHAR('W'),
+
+ EL_STEEL_CHAR('X'),
+ EL_STEEL_CHAR('Y'),
+ EL_STEEL_CHAR('Z'),
+ EL_STEEL_CHAR('['),
+
+ EL_STEEL_CHAR('\\'),
+ EL_STEEL_CHAR(']'),
+ EL_STEEL_CHAR('^'),
+ EL_STEEL_CHAR('_'),
+
+ EL_STEEL_CHAR('©'),
+ EL_STEEL_CHAR('Ä'),
+ EL_STEEL_CHAR('Ö'),
+ EL_STEEL_CHAR('Ü'),
+
+ EL_STEEL_CHAR('°'),
+ EL_STEEL_CHAR('®'),
+ EL_STEEL_CHAR(FONT_ASCII_CURSOR),
+ EL_STEEL_CHAR(FONT_ASCII_BUTTON),
+
+ EL_STEEL_CHAR(FONT_ASCII_UP),
+ EL_STEEL_CHAR(FONT_ASCII_DOWN),
+ EL_STEEL_CHAR(' '),
+ EL_STEEL_CHAR(' ')
+};
+static int *editor_hl_steel_chars_ptr = editor_hl_steel_chars;
+static int *editor_el_steel_chars_ptr = editor_el_steel_chars;
+static int num_editor_hl_steel_chars = SIZEOF_ARRAY_INT(editor_hl_steel_chars);
+static int num_editor_el_steel_chars = SIZEOF_ARRAY_INT(editor_el_steel_chars);
+
static int editor_hl_custom[] =
{
EL_INTERNAL_CASCADE_CE_ACTIVE,
EL_CHAR('C'),
EL_CHAR('E'),
EL_EMPTY,
-
-#if 0
- EL_CHAR('C'),
- EL_CHAR('U'),
- EL_CHAR('S'),
- EL_CHAR('-'),
-
- EL_CHAR('T'),
- EL_CHAR('O'),
- EL_CHAR('M'),
- EL_CHAR(' '),
-
- EL_CHAR('E'),
- EL_CHAR('L'),
- EL_CHAR('E'),
- EL_CHAR('M'),
-
- EL_CHAR('E'),
- EL_CHAR('N'),
- EL_CHAR('T'),
- EL_CHAR('S'),
-#endif
};
static int editor_el_custom[] =
static int num_editor_hl_custom = SIZEOF_ARRAY_INT(editor_hl_custom);
static int num_editor_el_custom = SIZEOF_ARRAY_INT(editor_el_custom);
-static int editor_hl_reference[] =
-{
- EL_INTERNAL_CASCADE_REF_ACTIVE,
- EL_CHAR('R'),
- EL_CHAR('E'),
- EL_CHAR('F')
-};
-
-static int editor_el_reference[] =
-{
- EL_TRIGGER_PLAYER,
- EL_TRIGGER_ELEMENT,
- EL_TRIGGER_CE_VALUE,
- EL_TRIGGER_CE_SCORE,
-
- EL_EMPTY,
- EL_EMPTY,
- EL_CURRENT_CE_VALUE,
- EL_CURRENT_CE_SCORE
-};
-static int *editor_hl_reference_ptr = editor_hl_reference;
-static int *editor_el_reference_ptr = editor_el_reference;
-static int num_editor_hl_reference = SIZEOF_ARRAY_INT(editor_hl_reference);
-static int num_editor_el_reference = SIZEOF_ARRAY_INT(editor_el_reference);
-
static int editor_hl_group[] =
{
EL_INTERNAL_CASCADE_GE_ACTIVE,
EL_CHAR('G'),
EL_CHAR('E'),
EL_EMPTY,
-
-#if 0
- EL_CHAR('G'),
- EL_CHAR('R'),
- EL_CHAR('O'),
- EL_CHAR('U'),
-
- EL_CHAR('P'),
- EL_CHAR(' '),
- EL_CHAR(' '),
- EL_CHAR(' '),
-
- EL_CHAR('E'),
- EL_CHAR('L'),
- EL_CHAR('E'),
- EL_CHAR('M'),
-
- EL_CHAR('E'),
- EL_CHAR('N'),
- EL_CHAR('T'),
- EL_CHAR('S'),
-#endif
-};
+};
static int editor_el_group[] =
{
static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group);
static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group);
+static int editor_hl_reference[] =
+{
+ EL_INTERNAL_CASCADE_REF_ACTIVE,
+ EL_CHAR('R'),
+ EL_CHAR('E'),
+ EL_CHAR('F')
+};
+
+static int editor_el_reference[] =
+{
+ EL_TRIGGER_PLAYER,
+ EL_TRIGGER_ELEMENT,
+ EL_TRIGGER_CE_VALUE,
+ EL_TRIGGER_CE_SCORE,
+
+ EL_SELF,
+ EL_ANY_ELEMENT,
+ EL_CURRENT_CE_VALUE,
+ EL_CURRENT_CE_SCORE,
+
+ EL_PREV_CE_8,
+ EL_PREV_CE_7,
+ EL_PREV_CE_6,
+ EL_PREV_CE_5,
+
+ EL_PREV_CE_4,
+ EL_PREV_CE_3,
+ EL_PREV_CE_2,
+ EL_PREV_CE_1,
+
+ EL_NEXT_CE_1,
+ EL_NEXT_CE_2,
+ EL_NEXT_CE_3,
+ EL_NEXT_CE_4,
+
+ EL_NEXT_CE_5,
+ EL_NEXT_CE_6,
+ EL_NEXT_CE_7,
+ EL_NEXT_CE_8,
+};
+static int *editor_hl_reference_ptr = editor_hl_reference;
+static int *editor_el_reference_ptr = editor_el_reference;
+static int num_editor_hl_reference = SIZEOF_ARRAY_INT(editor_hl_reference);
+static int num_editor_el_reference = SIZEOF_ARRAY_INT(editor_el_reference);
+
static int editor_hl_user_defined[] =
{
EL_INTERNAL_CASCADE_USER_ACTIVE,
EL_CHAR('M'),
EL_CHAR('Y'),
EL_EMPTY,
-
-#if 0
- EL_CHAR('U'),
- EL_CHAR('S'),
- EL_CHAR('E'),
- EL_CHAR('R'),
-
- EL_CHAR('D'),
- EL_CHAR('E'),
- EL_CHAR('F'),
- EL_CHAR('I'),
-
- EL_CHAR('-'),
- EL_CHAR('N'),
- EL_CHAR('E'),
- EL_CHAR('D'),
-#endif
};
static int *editor_hl_user_defined_ptr = editor_hl_user_defined;
&editor_hl_chars_ptr, &num_editor_hl_chars,
&editor_el_chars_ptr, &num_editor_el_chars
},
+ {
+ &setup.editor.el_steel_chars,
+ &setup.editor_cascade.el_steel_chars,
+ &editor_hl_steel_chars_ptr, &num_editor_hl_steel_chars,
+ &editor_el_steel_chars_ptr, &num_editor_el_steel_chars
+ },
{
&setup.editor.el_custom,
&setup.editor_cascade.el_ce,
&editor_hl_custom_ptr, &num_editor_hl_custom,
&editor_el_custom_ptr, &num_editor_el_custom
},
- {
- &setup.editor.el_custom,
- &setup.editor_cascade.el_ref,
- &editor_hl_reference_ptr, &num_editor_hl_reference,
- &editor_el_reference_ptr, &num_editor_el_reference
- },
{
&setup.editor.el_custom,
&setup.editor_cascade.el_ge,
&editor_hl_group_ptr, &num_editor_hl_group,
&editor_el_group_ptr, &num_editor_el_group
},
+ {
+ &setup.editor.el_custom,
+ &setup.editor_cascade.el_ref,
+ &editor_hl_reference_ptr, &num_editor_hl_reference,
+ &editor_el_reference_ptr, &num_editor_el_reference
+ },
{
&setup.editor.el_user_defined,
&setup.editor_cascade.el_user,
{
char *info_text = NULL;
-#if 1
if (element < MAX_NUM_ELEMENTS)
-#else
- if (element < NUM_FILE_ELEMENTS)
-#endif
{
if (strlen(element_info[element].description) > 0)
info_text = element_info[element].description;
if (i == ED_COUNTER_ID_SELECT_LEVEL)
{
font_type = FONT_LEVEL_NUMBER;
+#if 1
+ font_type_active = FONT_LEVEL_NUMBER_ACTIVE;
+#else
font_type_active = FONT_LEVEL_NUMBER;
-
+#endif
x += 2 * ED_GADGET_DISTANCE;
y -= ED_GADGET_DISTANCE;
GDI_SCROLLBAR_ITEMS_MAX, items_max,
GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
GDI_SCROLLBAR_ITEM_POSITION, item_position,
+ GDI_WHEEL_AREA_X, scrollbar_info[i].wheel_x,
+ GDI_WHEEL_AREA_Y, scrollbar_info[i].wheel_y,
+ GDI_WHEEL_AREA_WIDTH, scrollbar_info[i].wheel_width,
+ GDI_WHEEL_AREA_HEIGHT, scrollbar_info[i].wheel_height,
GDI_STATE, GD_BUTTON_UNPRESSED,
GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
int yoffset_above = MINI_TILEX + ED_GADGET_DISTANCE;
int yoffset = ED_BORDER_SIZE;
int x_left = gi_down->x - xoffset_left;
-#if 1
int x_right; /* set after gadget position was modified */
-#else
- int x_right = gi_up->x + gi_up->width + xoffset_right;
-#endif
int y_above = gi_down->y - yoffset_above;
int x = gi_down->x;
int y; /* set after gadget position was modified */
/* only change if corresponding selectbox has changed */
if (selectbox_info[ED_SELECTBOX_ID_ACTION_MODE].options !=
action_arg_modes[mode])
-#if 0
- custom_element_change.action_mode =
- (action_arg_modes[mode])[0].value;
-#else
custom_element_change.action_mode = -1;
-#endif
/* only change if corresponding selectbox has changed */
if (selectbox_info[ED_SELECTBOX_ID_ACTION_ARG].options !=
action_arg_options[i].options)
-#if 0
- custom_element_change.action_arg =
- action_arg_options[i].options[0].value;
-#else
custom_element_change.action_arg = -1;
-#endif
break;
}
}
}
-#if 1
-
static void copy_custom_element_settings(int element_from, int element_to)
{
struct ElementInfo *ei_from = &element_info[element_from];
copyElementInfo(ei_from, ei_to);
}
-#else
-
-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 base properties ---------- */
-#if 1
- ei_to->properties[EP_BITFIELD_BASE_NR] =
- ei_from->properties[EP_BITFIELD_BASE_NR];
-#else
- Properties[element_to][EP_BITFIELD_BASE_NR] =
- Properties[element_from][EP_BITFIELD_BASE_NR];
-#endif
-
- /* ---------- copy custom property values ---------- */
-
- ei_to->use_gfx_element = ei_from->use_gfx_element;
- ei_to->gfx_element = ei_from->gfx_element;
-
- ei_to->access_direction = ei_from->access_direction;
-
- ei_to->collect_score_initial = ei_from->collect_score_initial;
- ei_to->collect_count_initial = ei_from->collect_count_initial;
-
- ei_to->ce_value_fixed_initial = ei_from->ce_value_fixed_initial;
- ei_to->ce_value_random_initial = ei_from->ce_value_random_initial;
- ei_to->use_last_ce_value = ei_from->use_last_ce_value;
-
- ei_to->push_delay_fixed = ei_from->push_delay_fixed;
- ei_to->push_delay_random = ei_from->push_delay_random;
- ei_to->drop_delay_fixed = ei_from->drop_delay_fixed;
- ei_to->drop_delay_random = ei_from->drop_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->move_enter_element = ei_from->move_enter_element;
- ei_to->move_leave_element = ei_from->move_leave_element;
- ei_to->move_leave_type = ei_from->move_leave_type;
-
- ei_to->slippery_type = ei_from->slippery_type;
-
- ei_to->explosion_type = ei_from->explosion_type;
- ei_to->explosion_delay = ei_from->explosion_delay;
- ei_to->ignition_delay = ei_from->ignition_delay;
-
- for (y = 0; y < 3; y++)
- for (x = 0; x < 3; x++)
- ei_to->content.e[x][y] = ei_from->content.e[x][y];
-
- /* ---------- reinitialize and copy change pages ---------- */
-
- ei_to->num_change_pages = ei_from->num_change_pages;
- ei_to->current_change_page = ei_from->current_change_page;
-
- setElementChangePages(ei_to, ei_to->num_change_pages);
-
- for (i = 0; i < ei_to->num_change_pages; i++)
- ei_to->change_page[i] = ei_from->change_page[i];
-
- /* ---------- copy group element info ---------- */
- if (ei_from->group != NULL && ei_to->group != NULL) /* group or internal */
- *ei_to->group = *ei_from->group;
-
- /* mark this custom element as modified */
- ei_to->modified_settings = TRUE;
-}
-#endif
-
static void replace_custom_element_in_settings(int element_from,
int element_to)
{
void DrawLevelEd()
{
CloseDoor(DOOR_CLOSE_ALL);
+
+#if 1
+ FadeOut(REDRAW_FIELD);
+#endif
+
OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
#if DEBUG
ReinitializeElementList(); /* update dynamic level element list */
ReinitializeElementListButtons(); /* custom element may look different */
+#if 1
+ UnmapAllGadgets();
+#else
UnmapTapeButtons();
+#endif
MapControlButtons();
+#if 0
+ FadeOut(REDRAW_FIELD);
+#endif
+
DrawEditModeWindow();
+#if 1
+ FadeIn(REDRAW_FIELD);
+#endif
+
/* copy actual editor door content to door double buffer for OpenDoor() */
BlitBitmap(drawto, bitmap_db_door,
DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
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);
+ return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
+ max_lines_per_screen, -1, TRUE, FALSE, FALSE);
}
static void DrawPropertiesTabulatorGadgets()
{
- struct GadgetInfo *gd_gi = level_editor_gadget[GADGET_ID_PROPERTIES_INFO];
- struct GadgetDesign *gd = &gd_gi->alt_design[GD_BUTTON_UNPRESSED];
- int gd_x = gd->x + gd_gi->border.width / 2;
- int gd_y = gd->y + gd_gi->height - 1;
+ struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO];
+ struct GadgetInfo *gd_gi4 = level_editor_gadget[GADGET_ID_PROPERTIES_CHANGE];
+ struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED];
+ int gd_x = gd->x + gd_gi1->border.width / 2;
+ int gd_y = gd->y + gd_gi1->height - 1;
Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y);
int id_first = ED_TEXTBUTTON_ID_PROPERTIES_INFO;
int id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG;
+#if 1
+#else
int max_tabs = 4;
+#endif
int i;
- /* draw additional "advanced" tabulator for custom elements */
+ /* draw additional "change" tabulator for custom elements */
if (IS_CUSTOM_ELEMENT(properties_element))
id_last = ED_TEXTBUTTON_ID_PROPERTIES_CHANGE;
continue;
/* draw background line below tabulator button */
- ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width,1);
+ ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1);
/* draw solid line below inactive tabulator buttons */
if (!active && tab_color != BLACK_PIXEL) /* black => transparent */
- FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width,1, tab_color);
+ FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width, 1, tab_color);
ModifyGadget(gi, GDI_ACTIVE, active, GDI_END);
MapTextbuttonGadget(i);
}
+#if 1
+ /* draw little border line below tabulator buttons */
+ if (tab_color != BLACK_PIXEL) /* black => transparent */
+ FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1,
+ gd_gi4->x - gd_gi1->x + gd_gi4->width, ED_GADGET_DISTANCE,
+ tab_color);
+#else
/* draw little border line below tabulator buttons */
if (tab_color != BLACK_PIXEL) /* black => transparent */
- FillRectangle(drawto, gd_gi->x, gd_gi->y + gd_gi->height + 1,
- max_tabs * gd_gi->width + (max_tabs -1) * ED_GADGET_DISTANCE,
+ FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1,
+ max_tabs * gd_gi1->width + (max_tabs -1) * ED_GADGET_DISTANCE,
ED_GADGET_DISTANCE, tab_color);
+#endif
}
static void DrawPropertiesInfo()
/* pre-defined properties */
{ EP_CAN_PASS_MAGIC_WALL, "- can pass magic walls" },
+ { EP_CAN_PASS_DC_MAGIC_WALL,"- can pass magic walls (DC style)" },
{ EP_SWITCHABLE, "- can be switched" },
#if 0
{ EP_HAS_EDITOR_CONTENT, "- can contain other elements" },
int screen_line = 0;
int i, x, y;
-#if 1
if (setup.editor.show_element_token)
{
DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3,
screen_line++;
}
-#else
-
-#if DEBUG
- if (IS_CUSTOM_ELEMENT(properties_element))
- {
- DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3,
- "[Custom Element %d]", properties_element - EL_CUSTOM_START + 1);
- screen_line++;
- }
- else if (IS_GROUP_ELEMENT(properties_element))
- {
- DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3,
- "[Group Element %d]", properties_element - EL_GROUP_START + 1);
- screen_line++;
- }
-#endif
-#endif
-
/* ----- print number of elements / percentage of this element in level */
num_elements_in_level = 0;
{ EL_EMC_DRIPPER, &level.amoeba_speed, TEXT_AMOEBA_SPEED },
{ EL_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
{ EL_BD_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
+ { EL_DC_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION },
{ EL_ROBOT_WHEEL, &level.time_wheel, TEXT_DURATION },
-#if 1
- { EL_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION },
+ { EL_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION },
+ { EL_DC_TIMEGATE_SWITCH,&level.time_timegate, TEXT_DURATION },
{ EL_LIGHT_SWITCH, &level.time_light, TEXT_DURATION },
{ EL_LIGHT_SWITCH_ACTIVE, &level.time_light, TEXT_DURATION },
{ EL_SHIELD_NORMAL, &level.shield_normal_time, TEXT_DURATION },
{ EL_BIOMAZE, &level.biomaze[1], TEXT_GAME_OF_LIFE_2 },
{ EL_BIOMAZE, &level.biomaze[2], TEXT_GAME_OF_LIFE_3 },
{ EL_BIOMAZE, &level.biomaze[3], TEXT_GAME_OF_LIFE_4 },
-#endif
-#if 1
{ EL_EMC_ANDROID, &level.android_move_time, TEXT_MOVE_SPEED },
{ EL_EMC_ANDROID, &level.android_clone_time, TEXT_CLONE_SPEED },
{ EL_EMC_MAGIC_BALL, &level.ball_time, TEXT_BALL_DELAY },
{ EL_SPRING, &level.slurp_score, TEXT_SLURPING },
{ EL_EMC_LENSES, &level.lenses_time, TEXT_DURATION },
{ EL_EMC_MAGNIFIER, &level.magnify_time, TEXT_DURATION },
-#endif
{ -1, NULL, NULL }
};
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION);
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_SHIFTED_RELOCATION);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT);
if (properties_element == EL_TIME_ORB_FULL)
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG);
-#if 0
- if (properties_element == EL_BALLOON)
- MapSelectboxGadget(ED_SELECTBOX_ID_WIND_DIRECTION);
-#endif
-
if (CAN_GROW(properties_element))
{
checkbutton_info[ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE].y =
{
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);
}
{
int i;
- for (i = max_chars_per_line - 1; i >= 0; i--)
- if (buffer[i] == ' ')
- break;
+ for (i = max_chars_per_line - 1; i >= 0; i--)
+ if (buffer[i] == ' ')
+ break;
+
+ if (strlen(&element_name[i + 1]) <= max_chars_per_line)
+ {
+ buffer[i] = '\0';
+ next_pos = i + 1;
+ }
+ }
+
+ DrawTextS(x, y - font_height / 2, font_nr, buffer);
+
+ strncpy(buffer, &element_name[next_pos], max_chars_per_line);
+ buffer[max_chars_per_line] = '\0';
+
+ DrawTextS(x, y + font_height / 2, font_nr, buffer);
+ }
+}
+
+static void DrawPropertiesWindow()
+{
+ int xstart = 2;
+ int ystart = 4;
+
+ stick_element_properties_window = FALSE;
+
+ /* make sure that previous properties edit mode exists for this element */
+ if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG &&
+ !IS_CUSTOM_ELEMENT(properties_element))
+ edit_mode_properties = ED_MODE_PROPERTIES_CONFIG;
+
+ if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG &&
+ IS_CUSTOM_ELEMENT(properties_element))
+ edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_1;
+
+ CopyElementPropertiesToEditor(properties_element);
+
+ UnmapLevelEditorWindowGadgets();
+ UnmapLevelEditorToolboxDrawingGadgets();
+ UnmapLevelEditorToolboxCustomGadgets();
+
+ if (IS_CUSTOM_ELEMENT(properties_element) ||
+ IS_GROUP_ELEMENT(properties_element))
+ MapLevelEditorToolboxCustomGadgets();
+
+ SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
+ ClearWindow();
+
+#if 0
+ DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings");
+#else
+ DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
+ "Element Settings", FONT_TITLE_1);
+#endif
+
+ FrameCounter = 0; /* restart animation frame counter */
+
+ DrawElementBorder(SX + xstart * MINI_TILEX,
+ SY + ystart * MINI_TILEY + MINI_TILEY / 2,
+ TILEX, TILEY, FALSE);
+
+ DrawEditorElementAnimation(SX + xstart * MINI_TILEX,
+ SY + ystart * MINI_TILEY + MINI_TILEY / 2);
+
+ DrawEditorElementName((xstart + 3) * MINI_TILEX + 1,
+ (ystart + 1) * MINI_TILEY + 1,
+ properties_element);
+
+ DrawPropertiesTabulatorGadgets();
+
+ if (edit_mode_properties == ED_MODE_PROPERTIES_INFO)
+ DrawPropertiesInfo();
+ else if (edit_mode_properties == ED_MODE_PROPERTIES_CHANGE)
+ DrawPropertiesChange();
+ else /* (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG[_1|_2]) */
+ DrawPropertiesConfig();
+}
+
+static void UpdateCustomElementGraphicGadgets()
+{
+ int i;
+
+ ModifyEditorElementList();
+ RedrawDrawingElements();
+
+ /* force redraw of all mapped drawing area gadgets */
+ for (i = 0; i < ED_NUM_DRAWING_AREAS; i++)
+ {
+ struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[i].gadget_id];
+
+ if (gi->mapped)
+ MapDrawingArea(i);
+ }
+}
+
+static int getOpenDirectionFromTube(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 getTubeFromOpenDirection(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 getTubeFromOpenDirectionNotEmpty(int direction, int element_old)
+{
+ int element_new = getTubeFromOpenDirection(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);
+
+ if (direction == MV_NONE)
+ return EL_EMPTY;
+
+ return getBeltElementFromBeltNrAndBeltDir(nr, belt_dir);
+}
+
+static int getBeltFromNrAndOpenDirectionNotEmpty(int nr, int direction,
+ int element_old)
+{
+ int element_new = getBeltFromNrAndOpenDirection(nr, direction);
+
+ return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromPool(int element)
+{
+ switch (element)
+ {
+ case EL_ACID_POOL_TOPLEFT: return (MV_DOWN | MV_RIGHT);
+ case EL_ACID_POOL_TOPRIGHT: return (MV_DOWN | MV_LEFT);
+ case EL_ACID_POOL_BOTTOMLEFT: return (MV_UP | MV_RIGHT);
+ case EL_ACID_POOL_BOTTOMRIGHT: return (MV_UP | MV_LEFT);
+ case EL_ACID_POOL_BOTTOM: return (MV_HORIZONTAL | MV_UP);
+ case EL_ACID: return (MV_HORIZONTAL | MV_DOWN);
+ }
+
+ return MV_NONE;
+}
+
+static int getPoolFromOpenDirection(int direction)
+{
+ switch (direction)
+ {
+ case (MV_DOWN | MV_RIGHT): return EL_ACID_POOL_TOPLEFT;
+ case (MV_DOWN | MV_LEFT): return EL_ACID_POOL_TOPRIGHT;
+ case (MV_UP | MV_RIGHT): return EL_ACID_POOL_BOTTOMLEFT;
+ case (MV_UP | MV_LEFT): return EL_ACID_POOL_BOTTOMRIGHT;
+ case (MV_HORIZONTAL | MV_UP): return EL_ACID_POOL_BOTTOM;
+ case (MV_HORIZONTAL | MV_DOWN): return EL_ACID;
+ }
+
+ return EL_EMPTY;
+}
+
+static int getPoolFromOpenDirectionExt(int direction, int help_element)
+{
+ int element = getPoolFromOpenDirection(direction);
+ int help_direction = getOpenDirectionFromPool(help_element);
+
+ if (element == EL_EMPTY)
+ {
+ int help_direction_vertical = help_direction & MV_VERTICAL;
+
+ element = getPoolFromOpenDirection(direction | help_direction_vertical);
+ }
+
+ if (element == EL_EMPTY)
+ {
+ int help_direction_horizontal = help_direction & MV_HORIZONTAL;
+
+ element = getPoolFromOpenDirection(direction | help_direction_horizontal);
+ }
+
+ return element;
+}
+
+static int getPoolFromOpenDirectionNotEmpty(int direction, int element_old)
+{
+ int element_new = getPoolFromOpenDirectionExt(direction, element_old);
+
+ return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromPillar(int element)
+{
+ switch (element)
+ {
+ case EL_EMC_WALL_1: return (MV_DOWN);
+ case EL_EMC_WALL_2: return (MV_VERTICAL);
+ case EL_EMC_WALL_3: return (MV_UP);
+ }
+
+ return MV_NONE;
+}
+
+static int getPillarFromOpenDirection(int direction)
+{
+ switch (direction)
+ {
+ case (MV_DOWN): return EL_EMC_WALL_1;
+ case (MV_VERTICAL): return EL_EMC_WALL_2;
+ case (MV_UP): return EL_EMC_WALL_3;
+ }
+
+ return EL_EMPTY;
+}
+
+static int getPillarFromOpenDirectionNotEmpty(int direction, int element_old)
+{
+ int element_new = getPillarFromOpenDirection(direction);
+
+ return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromSteel2(int element)
+{
+ switch (element)
+ {
+ case EL_DC_STEELWALL_2_LEFT: return (MV_RIGHT);
+ case EL_DC_STEELWALL_2_RIGHT: return (MV_LEFT);
+ case EL_DC_STEELWALL_2_TOP: return (MV_DOWN);
+ case EL_DC_STEELWALL_2_BOTTOM: return (MV_UP);
+ case EL_DC_STEELWALL_2_HORIZONTAL: return (MV_HORIZONTAL);
+ case EL_DC_STEELWALL_2_VERTICAL: return (MV_VERTICAL);
+ case EL_DC_STEELWALL_2_MIDDLE: return (MV_ANY_DIRECTION);
+ case EL_DC_STEELWALL_2_SINGLE: return (MV_NONE);
+ }
+
+ return MV_NONE;
+}
+
+static int getSteel2FromOpenDirection(int direction)
+{
+ switch (direction)
+ {
+ case (MV_RIGHT): return EL_DC_STEELWALL_2_LEFT;
+ case (MV_LEFT): return EL_DC_STEELWALL_2_RIGHT;
+ case (MV_DOWN): return EL_DC_STEELWALL_2_TOP;
+ case (MV_UP): return EL_DC_STEELWALL_2_BOTTOM;
+ case (MV_HORIZONTAL): return EL_DC_STEELWALL_2_HORIZONTAL;
+ case (MV_VERTICAL): return EL_DC_STEELWALL_2_VERTICAL;
+ case (MV_ANY_DIRECTION): return EL_DC_STEELWALL_2_MIDDLE;
+ case (MV_NONE): return EL_DC_STEELWALL_2_SINGLE;
+ }
+
+ return EL_EMPTY;
+}
+
+static int getSteel2FromOpenDirectionNotEmpty(int direction, int element_old)
+{
+ int element_new = getSteel2FromOpenDirection(direction);
+
+ return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromChip(int element)
+{
+ switch (element)
+ {
+ case EL_SP_CHIP_SINGLE: return (MV_NONE);
+ case EL_SP_CHIP_LEFT: return (MV_RIGHT);
+ case EL_SP_CHIP_RIGHT: return (MV_LEFT);
+ case EL_SP_CHIP_TOP: return (MV_DOWN);
+ case EL_SP_CHIP_BOTTOM: return (MV_UP);
+ }
+
+ return MV_NONE;
+}
+
+static int getChipFromOpenDirection(int direction)
+{
+ switch (direction)
+ {
+ case (MV_NONE): return EL_SP_CHIP_SINGLE;
+ case (MV_LEFT): return EL_SP_CHIP_RIGHT;
+ case (MV_RIGHT): return EL_SP_CHIP_LEFT;
+ case (MV_UP): return EL_SP_CHIP_BOTTOM;
+ case (MV_DOWN): return EL_SP_CHIP_TOP;
+ }
+
+ return EL_EMPTY;
+}
+
+static int getChipFromOpenDirectionNotEmpty(int direction, int element_old)
+{
+ int element_new = getChipFromOpenDirection(direction);
+
+ return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+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 direction_old = getOpenDirectionFromTube(element_old);
+ int 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]) &&
+ (direction_old & dir) &&
+ (getOpenDirectionFromTube(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+ direction_new |= dir;
+ }
+
+ return getTubeFromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static int getClosedBelt(int x, int y)
+{
+ static int xy[4][2] =
+ {
+ { -1, 0 },
+ { +1, 0 },
+ { 0, -1 },
+ { 0, +1 }
+ };
+ int element_old = IntelliDrawBuffer[x][y];
+ int nr = getBeltNrFromBeltElement(element_old);
+ int direction_old = getOpenDirectionFromBelt(element_old);
+ int direction_new = MV_NONE;
+ int i;
+
+ for (i = MV_BIT_LEFT; i <= MV_BIT_RIGHT; 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]) &&
+ (direction_old & dir) &&
+ (getOpenDirectionFromBelt(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+ direction_new |= dir;
+ }
+
+ return getBeltFromNrAndOpenDirection(nr, direction_new);
+}
+
+static int getClosedPool(int x, int y)
+{
+ static int xy[4][2] =
+ {
+ { -1, 0 },
+ { +1, 0 },
+ { 0, -1 },
+ { 0, +1 }
+ };
+ int element_old = IntelliDrawBuffer[x][y];
+ int direction_old = getOpenDirectionFromPool(element_old);
+ int 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_ACID_POOL_OR_ACID(IntelliDrawBuffer[xx][yy]) &&
+ (direction_old & dir) &&
+ (getOpenDirectionFromPool(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+ direction_new |= dir;
+ }
+
+ return getPoolFromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static int getClosedPillar(int x, int y)
+{
+ static int xy[4][2] =
+ {
+ { -1, 0 },
+ { +1, 0 },
+ { 0, -1 },
+ { 0, +1 }
+ };
+ int element_old = IntelliDrawBuffer[x][y];
+ int direction_old = getOpenDirectionFromPillar(element_old);
+ int direction_new = MV_NONE;
+ int i;
+
+ for (i = MV_BIT_UP; i <= MV_BIT_DOWN; 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_EMC_PILLAR(IntelliDrawBuffer[xx][yy]) &&
+ (direction_old & dir) &&
+ (getOpenDirectionFromPillar(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+ direction_new |= dir;
+ }
+
+ return getPillarFromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static int getClosedSteel2(int x, int y)
+{
+ static int xy[4][2] =
+ {
+ { -1, 0 },
+ { +1, 0 },
+ { 0, -1 },
+ { 0, +1 }
+ };
+ int element_old = IntelliDrawBuffer[x][y];
+ int direction_old = getOpenDirectionFromSteel2(element_old);
+ int 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_DC_STEELWALL_2(IntelliDrawBuffer[xx][yy]) &&
+ (direction_old & dir) &&
+ (getOpenDirectionFromSteel2(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+ direction_new |= dir;
+ }
+
+ return getSteel2FromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static int getClosedChip(int x, int y)
+{
+ static int xy[4][2] =
+ {
+ { -1, 0 },
+ { +1, 0 },
+ { 0, -1 },
+ { 0, +1 }
+ };
+ int element_old = IntelliDrawBuffer[x][y];
+ int direction_old = getOpenDirectionFromChip(element_old);
+ int 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_SP_CHIP(IntelliDrawBuffer[xx][yy]) &&
+ (direction_old & dir) &&
+ (getOpenDirectionFromChip(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+ direction_new |= dir;
+ }
+
+ return getChipFromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static void SetElementSimple(int x, int y, int element, boolean change_level)
+{
+ int sx = x - level_xpos;
+ int sy = y - level_ypos;
+
+ IntelliDrawBuffer[x][y] = element;
+
+ if (change_level)
+ Feld[x][y] = element;
+
+ if (IN_ED_FIELD(sx, sy))
+ DrawMiniElement(sx, sy, element);
+}
+
+static void MergeAndCloseNeighbourElements(int x1, int y1, int *element1,
+ int x2, int y2, int *element2,
+ int (*close_function)(int, int),
+ boolean change_level)
+{
+ /* set neighbour elements to newly determined connections */
+ SetElementSimple(x1, y1, *element1, change_level);
+ SetElementSimple(x2, y2, *element2, change_level);
+
+ /* remove all open connections of neighbour elements */
+ *element1 = close_function(x1, y1);
+ *element2 = close_function(x2, y2);
+
+ /* set neighbour elements to new, minimized connections */
+ SetElementSimple(x1, y1, *element1, change_level);
+ SetElementSimple(x2, y2, *element2, change_level);
+}
+
+static void SetElementIntelliDraw(int x, int y, int new_element,
+ boolean change_level, int button)
+{
+ static int xy[4][2] =
+ {
+ { -1, 0 },
+ { +1, 0 },
+ { 0, -1 },
+ { 0, +1 }
+ };
+ 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))
+ {
+ int last_element_new = EL_UNDEFINED;
+ int direction = MV_NONE;
+ int i;
+
+ /* if old element is of same kind, keep all existing directions */
+ if (IS_TUBE(old_element))
+ direction |= getOpenDirectionFromTube(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 = getOpenDirectionFromTube(last_element_old);
+ int last_direction_new = last_direction_old | dir_opposite;
+
+ last_element_new = getTubeFromOpenDirection(last_direction_new);
+
+ direction |= dir;
+ }
+ }
+
+ new_element = getTubeFromOpenDirectionNotEmpty(direction, new_element);
+
+ if (last_element_new != EL_UNDEFINED)
+ MergeAndCloseNeighbourElements(x, y, &new_element,
+ last_x, last_y, &last_element_new,
+ getClosedTube, change_level);
+ }
+ else if (IS_BELT(new_element))
+ {
+ int belt_nr = getBeltNrFromBeltElement(new_element);
+ int last_element_new = EL_UNDEFINED;
+ int direction = MV_NONE;
+ int i;
+
+ /* if old element is of same kind, keep all existing directions */
+ if (IS_BELT(old_element))
+ direction |= getOpenDirectionFromBelt(old_element);
+
+ for (i = MV_BIT_LEFT; i <= MV_BIT_RIGHT; 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_BELT(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_belt_nr = getBeltNrFromBeltElement(last_element_old);
+ int last_direction_old = getOpenDirectionFromBelt(last_element_old);
+ int last_direction_new = last_direction_old | dir_opposite;
+
+ last_element_new = getBeltFromNrAndOpenDirection(last_belt_nr,
+ last_direction_new);
+ direction |= dir;
+ }
+ }
+
+ new_element = getBeltFromNrAndOpenDirectionNotEmpty(belt_nr, direction,
+ new_element);
+ if (last_element_new != EL_UNDEFINED)
+ MergeAndCloseNeighbourElements(x, y, &new_element,
+ last_x, last_y, &last_element_new,
+ getClosedBelt, change_level);
+ }
+ else if (IS_ACID_POOL_OR_ACID(new_element))
+ {
+ int last_element_new = EL_UNDEFINED;
+ int direction = MV_NONE;
+ int i;
+
+ /* if old element is of same kind, keep all existing directions */
+ if (IS_ACID_POOL_OR_ACID(old_element))
+ direction |= getOpenDirectionFromPool(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_ACID_POOL_OR_ACID(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 = getOpenDirectionFromPool(last_element_old);
+ int last_direction_new = last_direction_old | dir_opposite;
+
+ last_element_new = getPoolFromOpenDirection(last_direction_new);
+
+ direction |= dir;
+ }
+ }
+
+ /* special corrections needed for intuitively correct acid pool drawing */
+ if (last_element_new == EL_EMPTY)
+ last_element_new = new_element;
+ else if (last_element_new != EL_UNDEFINED)
+ new_element = last_element_new;
+
+ new_element = getPoolFromOpenDirectionNotEmpty(direction, new_element);
+
+ if (last_element_new != EL_UNDEFINED)
+ MergeAndCloseNeighbourElements(x, y, &new_element,
+ last_x, last_y, &last_element_new,
+ getClosedPool, change_level);
+ }
+ else if (IS_EMC_PILLAR(new_element))
+ {
+ int last_element_new = EL_UNDEFINED;
+ int direction = MV_NONE;
+ int i;
+
+ /* if old element is of same kind, keep all existing directions */
+ if (IS_EMC_PILLAR(old_element))
+ direction |= getOpenDirectionFromPillar(old_element);
+
+ for (i = MV_BIT_UP; i <= MV_BIT_DOWN; 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_EMC_PILLAR(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 = getOpenDirectionFromPillar(last_element_old);
+ int last_direction_new = last_direction_old | dir_opposite;
+
+ last_element_new = getPillarFromOpenDirection(last_direction_new);
+
+ direction |= dir;
+ }
+ }
+
+ new_element = getPillarFromOpenDirectionNotEmpty(direction, new_element);
+
+ if (last_element_new != EL_UNDEFINED)
+ MergeAndCloseNeighbourElements(x, y, &new_element,
+ last_x, last_y, &last_element_new,
+ getClosedPillar, change_level);
+ }
+ else if (IS_DC_STEELWALL_2(new_element))
+ {
+ int last_element_new = EL_UNDEFINED;
+ int direction = MV_NONE;
+ int i;
+
+ /* if old element is of same kind, keep all existing directions */
+ if (IS_DC_STEELWALL_2(old_element))
+ direction |= getOpenDirectionFromSteel2(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_DC_STEELWALL_2(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 = getOpenDirectionFromSteel2(last_element_old);
+ int last_direction_new = last_direction_old | dir_opposite;
+
+ last_element_new = getSteel2FromOpenDirection(last_direction_new);
+
+ direction |= dir;
+ }
+ }
+
+ new_element = getSteel2FromOpenDirectionNotEmpty(direction, new_element);
+
+ if (last_element_new != EL_UNDEFINED)
+ MergeAndCloseNeighbourElements(x, y, &new_element,
+ last_x, last_y, &last_element_new,
+ getClosedSteel2, change_level);
+ }
+ else if (IS_SP_CHIP(new_element))
+ {
+ int last_element_new = EL_UNDEFINED;
+ int direction = MV_NONE;
+ int i;
+
+ /* (do not keep existing directions, regardless of kind of 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_SP_CHIP(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 = getOpenDirectionFromChip(last_element_old);
+ int last_direction_new = last_direction_old | dir_opposite;
+
+ if (last_direction_old == MV_NONE)
+ {
+ last_element_new = getChipFromOpenDirection(last_direction_new);
+ direction |= dir;
+ }
+ else if (last_direction_old & (dir | dir_opposite))
+ {
+ direction |= MV_DIR_OPPOSITE(last_direction_old);
+ }
+ else
+ {
+ direction |= MV_DIR_OPPOSITE(dir);
+ }
+ }
+ }
+
+ new_element = getChipFromOpenDirectionNotEmpty(direction, new_element);
+
+ if (last_element_new != EL_UNDEFINED)
+ MergeAndCloseNeighbourElements(x, y, &new_element,
+ last_x, last_y, &last_element_new,
+ getClosedChip, change_level);
+ }
+ else if (IS_SP_HARDWARE_BASE(new_element))
+ {
+ int nr = GetSimpleRandom(6);
+
+ new_element = (nr == 0 ? EL_SP_HARDWARE_BASE_1 :
+ nr == 1 ? EL_SP_HARDWARE_BASE_2 :
+ nr == 2 ? EL_SP_HARDWARE_BASE_3 :
+ nr == 3 ? EL_SP_HARDWARE_BASE_4 :
+ nr == 4 ? EL_SP_HARDWARE_BASE_5 : EL_SP_HARDWARE_BASE_6);
+ }
+ else if (new_element == EL_SP_HARDWARE_GREEN ||
+ new_element == EL_SP_HARDWARE_BLUE ||
+ new_element == EL_SP_HARDWARE_RED)
+ {
+ int nr = GetSimpleRandom(3);
+
+ new_element = (nr == 0 ? EL_SP_HARDWARE_GREEN :
+ nr == 1 ? EL_SP_HARDWARE_BLUE : EL_SP_HARDWARE_RED);
+ }
+ else if (IS_GROUP_ELEMENT(new_element))
+ {
+ boolean connected_drawing = FALSE;
+ int i;
+
+ 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_IN_GROUP_EL(IntelliDrawBuffer[last_x][last_y], new_element))
+ connected_drawing = TRUE;
+ }
+
+ if (!connected_drawing)
+ ResolveGroupElement(new_element);
+
+ new_element = GetElementFromGroupElement(new_element);
+ }
+ 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);
- if (strlen(&element_name[i + 1]) <= max_chars_per_line)
+ 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 },
+ };
+ static int rotatable_elements[][4] =
+ {
{
- buffer[i] = '\0';
- next_pos = i + 1;
- }
- }
+ EL_BUG_UP,
+ EL_BUG_RIGHT,
+ EL_BUG_DOWN,
+ EL_BUG_LEFT
+ },
- DrawTextS(x, y - font_height / 2, font_nr, buffer);
+ {
+ EL_SPACESHIP_UP,
+ EL_SPACESHIP_RIGHT,
+ EL_SPACESHIP_DOWN,
+ EL_SPACESHIP_LEFT
+ },
- strncpy(buffer, &element_name[next_pos], max_chars_per_line);
- buffer[max_chars_per_line] = '\0';
+ {
+ EL_BD_BUTTERFLY_UP,
+ EL_BD_BUTTERFLY_RIGHT,
+ EL_BD_BUTTERFLY_DOWN,
+ EL_BD_BUTTERFLY_LEFT
+ },
- DrawTextS(x, y + font_height / 2, font_nr, buffer);
- }
-}
+ {
+ EL_BD_FIREFLY_UP,
+ EL_BD_FIREFLY_RIGHT,
+ EL_BD_FIREFLY_DOWN,
+ EL_BD_FIREFLY_LEFT
+ },
-static void DrawPropertiesWindow()
-{
- int xstart = 2;
- int ystart = 4;
+ {
+ EL_PACMAN_UP,
+ EL_PACMAN_RIGHT,
+ EL_PACMAN_DOWN,
+ EL_PACMAN_LEFT
+ },
- stick_element_properties_window = FALSE;
+ {
+ EL_YAMYAM_UP,
+ EL_YAMYAM_RIGHT,
+ EL_YAMYAM_DOWN,
+ EL_YAMYAM_LEFT
+ },
- /* make sure that previous properties edit mode exists for this element */
- if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG &&
- !IS_CUSTOM_ELEMENT(properties_element))
- edit_mode_properties = ED_MODE_PROPERTIES_CONFIG;
+ {
+ EL_ARROW_UP,
+ EL_ARROW_RIGHT,
+ EL_ARROW_DOWN,
+ EL_ARROW_LEFT
+ },
- if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG &&
- IS_CUSTOM_ELEMENT(properties_element))
- edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_1;
+ {
+ EL_SP_PORT_UP,
+ EL_SP_PORT_RIGHT,
+ EL_SP_PORT_DOWN,
+ EL_SP_PORT_LEFT
+ },
- CopyElementPropertiesToEditor(properties_element);
+ {
+ EL_SP_GRAVITY_PORT_UP,
+ EL_SP_GRAVITY_PORT_RIGHT,
+ EL_SP_GRAVITY_PORT_DOWN,
+ EL_SP_GRAVITY_PORT_LEFT
+ },
- UnmapLevelEditorWindowGadgets();
- UnmapLevelEditorToolboxDrawingGadgets();
- UnmapLevelEditorToolboxCustomGadgets();
+ {
+ EL_MOLE_UP,
+ EL_MOLE_RIGHT,
+ EL_MOLE_DOWN,
+ EL_MOLE_LEFT
+ },
- if (IS_CUSTOM_ELEMENT(properties_element) ||
- IS_GROUP_ELEMENT(properties_element))
- MapLevelEditorToolboxCustomGadgets();
+ {
+ EL_BALLOON_SWITCH_UP,
+ EL_BALLOON_SWITCH_RIGHT,
+ EL_BALLOON_SWITCH_DOWN,
+ EL_BALLOON_SWITCH_LEFT
+ },
- SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
- ClearWindow();
+ {
+ EL_SP_GRAVITY_ON_PORT_UP,
+ EL_SP_GRAVITY_ON_PORT_RIGHT,
+ EL_SP_GRAVITY_ON_PORT_DOWN,
+ EL_SP_GRAVITY_ON_PORT_LEFT
+ },
-#if 0
- DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings");
-#else
- DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
- "Element Settings", FONT_TITLE_1);
-#endif
+ {
+ EL_SP_GRAVITY_OFF_PORT_UP,
+ EL_SP_GRAVITY_OFF_PORT_RIGHT,
+ EL_SP_GRAVITY_OFF_PORT_DOWN,
+ EL_SP_GRAVITY_OFF_PORT_LEFT
+ },
-#if 1
- FrameCounter = 0; /* restart animation frame counter */
-#endif
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ },
+ };
+ int i, j;
+
+ for (i = 0; swappable_elements[i][0] != -1; i++)
+ {
+ int element1 = swappable_elements[i][0];
+ int element2 = swappable_elements[i][1];
- DrawElementBorder(SX + xstart * MINI_TILEX,
- SY + ystart * MINI_TILEY + MINI_TILEY / 2,
- TILEX, TILEY, FALSE);
-#if 1
- DrawEditorElementAnimation(SX + xstart * MINI_TILEX,
- SY + ystart * MINI_TILEY + MINI_TILEY / 2);
-#else
- DrawGraphicAnimationExt(drawto,
- SX + xstart * MINI_TILEX,
- SY + ystart * MINI_TILEY + MINI_TILEY / 2,
- el2img(properties_element), -1, NO_MASKING);
-#endif
+ if (old_element == element1 || old_element == element2)
+ new_element = (old_element == element1 ? element2 : element1);
+ }
-#if 0
- FrameCounter = 0; /* restart animation frame counter */
-#endif
+ for (i = 0; rotatable_elements[i][0] != -1; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ int element = rotatable_elements[i][j];
- DrawEditorElementName((xstart + 3) * MINI_TILEX + 1,
- (ystart + 1) * MINI_TILEY + 1,
- properties_element);
+ if (old_element == element)
+ new_element = (button == 1 ? rotatable_elements[i][(j + 3) % 4] :
+ button == 2 ? rotatable_elements[i][0] :
+ button == 3 ? rotatable_elements[i][(j + 1) % 4] :
+ old_element);
+ }
+ }
+ }
- DrawPropertiesTabulatorGadgets();
+ SetElementSimple(x, y, new_element, change_level);
- if (edit_mode_properties == ED_MODE_PROPERTIES_INFO)
- DrawPropertiesInfo();
- else if (edit_mode_properties == ED_MODE_PROPERTIES_CHANGE)
- DrawPropertiesChange();
- else /* (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG[_1|_2]) */
- DrawPropertiesConfig();
+ last_x = x;
+ last_y = y;
}
-static void UpdateCustomElementGraphicGadgets()
+static void ResetIntelliDraw()
{
- int i;
+ int x, y;
- ModifyEditorElementList();
- RedrawDrawingElements();
+ for (x = 0; x < lev_fieldx; x++)
+ for (y = 0; y < lev_fieldy; y++)
+ IntelliDrawBuffer[x][y] = Feld[x][y];
- /* force redraw of all mapped drawing area gadgets */
- for (i = 0; i < ED_NUM_DRAWING_AREAS; i++)
- {
- struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[i].gadget_id];
+ SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE, -1);
+}
- if (gi->mapped)
- MapDrawingArea(i);
- }
+static void SetElementExt(int x, int y, int element, boolean change_level,
+ int button)
+{
+ if (element < 0)
+ SetElementSimple(x, y, Feld[x][y], change_level);
+ else if (GetKeyModState() & KMOD_Shift)
+ SetElementIntelliDraw(x, y, element, change_level, button);
+ else
+ SetElementSimple(x, y, element, change_level);
+}
+
+static void SetElement(int x, int y, int element)
+{
+ SetElementExt(x, y, element, TRUE, -1);
+}
+
+static void SetElementButton(int x, int y, int element, int button)
+{
+ SetElementExt(x, y, element, TRUE, button);
}
static void DrawLineElement(int sx, int sy, int element, boolean change_level)
int lx = sx + level_xpos;
int ly = sy + level_ypos;
- DrawMiniElement(sx, sy, (element < 0 ? Feld[lx][ly] : element));
-
- if (change_level)
- Feld[lx][ly] = element;
+ SetElementExt(lx, ly, element, change_level, -1);
}
static void DrawLine(int from_x, int from_y, int to_x, int to_y,
int element, boolean change_level)
{
+ int xsize = ABS(to_x - from_x);
+ int ysize = ABS(to_y - from_y);
+ int dx = (to_x < from_x ? -1 : +1);
+ int dy = (to_y < from_y ? -1 : +1);
+ int i;
+
if (from_y == to_y) /* horizontal line */
{
- int x;
- int y = from_y;
-
- if (from_x > to_x)
- swap_numbers(&from_x, &to_x);
-
- for (x = from_x; x <= to_x; x++)
- DrawLineElement(x, y, element, change_level);
+ for (i = 0; i <= xsize; i++)
+ DrawLineElement(from_x + i * dx, from_y, element, change_level);
}
else if (from_x == to_x) /* vertical line */
{
- int x = from_x;
- int y;
-
- if (from_y > to_y)
- swap_numbers(&from_y, &to_y);
-
- for (y = from_y; y <= to_y; y++)
- DrawLineElement(x, y, element, change_level);
+ for (i = 0; i <= ysize; i++)
+ DrawLineElement(from_x, from_y + i * dy, element, change_level);
}
else /* diagonal line */
{
- int len_x = ABS(to_x - from_x);
- int len_y = ABS(to_y - from_y);
- int x, y;
-
- if (len_y < len_x) /* a < 1 */
+ if (ysize < xsize) /* a < 1 */
{
- float a = (float)len_y / (float)len_x;
-
- if (from_x > to_x)
- swap_number_pairs(&from_x, &from_y, &to_x, &to_y);
+ float a = (float)ysize / (float)xsize;
- for (x = 0; x <= len_x; x++)
+ for (i = 0; i <= xsize; i++)
{
- y = (int)(a * x + 0.5) * (to_y < from_y ? -1 : +1);
+ int x = dx * i;
+ int y = dy * (int)(a * i + 0.5);
+
DrawLineElement(from_x + x, from_y + y, element, change_level);
}
}
else /* a >= 1 */
{
- float a = (float)len_x / (float)len_y;
-
- if (from_y > to_y)
- swap_number_pairs(&from_x, &from_y, &to_x, &to_y);
+ float a = (float)xsize / (float)ysize;
- for (y = 0; y <= len_y; y++)
+ for (i = 0; i <= ysize; i++)
{
- x = (int)(a * y + 0.5) * (to_x < from_x ? -1 : +1);
+ int x = dx * (int)(a * i + 0.5);
+ int y = dy * i;
+
DrawLineElement(from_x + x, from_y + y, element, change_level);
}
}
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];
static void FloodFill(int from_x, int from_y, int fill_element)
{
- int i,x,y;
- int old_element;
- static int check[4][2] = { {-1,0}, {0,-1}, {1,0}, {0,1} };
- static int safety = 0;
-
- /* check if starting field still has the desired content */
- if (Feld[from_x][from_y] == fill_element)
- return;
-
- safety++;
-
- if (safety > lev_fieldx*lev_fieldy)
- Error(ERR_EXIT, "Something went wrong in 'FloodFill()'. Please debug.");
-
- old_element = Feld[from_x][from_y];
- Feld[from_x][from_y] = fill_element;
-
- for (i = 0; i < 4; i++)
- {
- x = from_x + check[i][0];
- y = from_y + check[i][1];
-
- if (IN_LEV_FIELD(x,y) && Feld[x][y] == old_element)
- FloodFill(x, y, fill_element);
- }
-
- safety--;
+ FloodFillLevel(from_x, from_y, fill_element, Feld, lev_fieldx, lev_fieldy);
}
/* values for DrawLevelText() modes */
int num_percentage, num_elements;
int x, y;
+#if 1
+ ResetIntelliDraw();
+#endif
+
/* determine number of free positions for randomly placing the new element */
for (x = 0; x < lev_fieldx; x++) for (y = 0; y < lev_fieldy; y++)
{
for (x = 0; x < lev_fieldx; x++)
for (y = 0; y < lev_fieldy; y++)
if (free_position[x][y])
+#if 1
+ SetElement(x, y, new_element);
+#else
Feld[x][y] = new_element;
+#endif
}
else
{
while (num_elements > 0)
{
- x = RND(lev_fieldx);
- y = RND(lev_fieldy);
+ x = GetSimpleRandom(lev_fieldx);
+ y = GetSimpleRandom(lev_fieldy);
/* don't place element at the same position twice */
if (free_position[x][y])
{
free_position[x][y] = FALSE;
+#if 1
+ SetElement(x, y, new_element);
+#else
Feld[x][y] = new_element;
+#endif
num_elements--;
}
}
if (!started_inside_drawing_area)
return;
-#if 1
if (!IS_VALID_BUTTON(button))
return;
-#endif
if (!button && !button_release_event)
return;
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
+ SetElementButton(lx, ly, new_element, button);
+#else
Feld[lx][ly] = new_element;
DrawMiniElement(sx, sy, new_element);
+#endif
}
}
else
{
int type_id = gi->custom_type_id;
+#if 1
+ strncpy(textarea_info[type_id].value, gi->textarea.value,
+ MAX_ENVELOPE_TEXT_LEN);
+ textarea_info[type_id].value[MAX_ENVELOPE_TEXT_LEN] = '\0';
+#else
+ /* !!! BUGGY !!! MAX_ENVELOPE_TEXT_LEN != MAX_GADGET_TEXTSIZE !!! */
strcpy(textarea_info[type_id].value, gi->textarea.value);
+#endif
level.changed = TRUE;
}
{
/* when changing action type, also check action mode and action arg */
if (value_old != value_new)
- {
-#if 1
setSelectboxSpecialActionVariablesIfNeeded();
-#else
- custom_element_change.action_mode = -1;
- custom_element_change.action_arg = -1;
-#endif
- }
DrawPropertiesChange();
}
int new_element = BUTTON_ELEMENT(button);
int x, y;
-#if 0
- /* MAKES PROBLEMS WITH ELEMENT LIST SCROLLBAR AND IS PROBABLY NOT NEEDED */
- /* !!! CHECK WHAT HAPPENS WHEN MOUSE WHEEL IS USED OVER ELEMENT LIST !!! */
-
- if (!IS_VALID_BUTTON(button))
- return;
-#endif
-
if (edit_mode == ED_MODE_DRAWING && drawing_function == GADGET_ID_TEXT)
DrawLevelText(0, 0, 0, TEXT_END);
break;
case GADGET_ID_EXIT:
- RequestExitLevelEditor(TRUE); /* if level has changed, ask user */
+ RequestExitLevelEditor(TRUE, FALSE); /* if level has changed, ask user */
break;
default:
case KSYM_Insert:
case KSYM_Delete:
-#if 1
- /* IS_EDITOR_CASCADE */
+
+ /* this is needed to prevent interference with running "True X-Mouse" */
+ if (GetKeyModStateFromEvents() & KMOD_Control)
+ break;
+
+ /* check for last or next editor cascade block in element list */
for (i = 0; i < num_editor_elements; i++)
{
if ((key == KSYM_Insert && i == element_shift) ||
ModifyEditorElementList();
-#else
-
- for (i = 0; i < num_editor_elements; i++)
- {
- int e = editor_elements[i];
-
- if ((key == KSYM_Insert &&
- (e == EL_INTERNAL_CASCADE_CE ||
- e == EL_INTERNAL_CASCADE_CE_ACTIVE)) ||
- (key == KSYM_Delete &&
- (e == EL_INTERNAL_CASCADE_GE ||
- e == EL_INTERNAL_CASCADE_GE_ACTIVE)))
- break;
- }
-
- if (i < num_editor_elements)
- {
- element_shift = i;
-
- if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
- element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
-
- ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL],
- GDI_SCROLLBAR_ITEM_POSITION,
- element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END);
-
- ModifyEditorElementList();
- }
-#endif
-
break;
case KSYM_Escape:
if (edit_mode == ED_MODE_DRAWING)
{
- RequestExitLevelEditor(setup.ask_on_escape_editor);
+ RequestExitLevelEditor(setup.ask_on_escape_editor, TRUE);
}
else if (edit_mode == ED_MODE_INFO)
{
DrawDrawingWindow();
edit_mode = ED_MODE_DRAWING;
}
+
break;
default:
if (!DelayReached(&action_delay, action_delay_value))
return;
-#if 1
DrawEditorElementAnimation(SX + xpos * TILEX,
SY + ypos * TILEY + MINI_TILEY / 2);
-#else
- DrawGraphicAnimationExt(drawto,
- SX + xpos * TILEX,
- SY + ypos * TILEY + MINI_TILEY / 2,
- el2img(properties_element), -1, NO_MASKING);
-#endif
MarkTileDirty(xpos, ypos);
MarkTileDirty(xpos, ypos + 1);
void HandleEditorGadgetInfoText(void *ptr)
{
struct GadgetInfo *gi = (struct GadgetInfo *)ptr;
-#if 0
- char infotext[MAX_OUTPUT_LINESIZE + 1];
- char shortcut[MAX_OUTPUT_LINESIZE + 1];
- int max_infotext_len = getMaxInfoTextLength();
-#endif
if (game_status != GAME_MODE_EDITOR)
return;
if (edit_mode == ED_MODE_DRAWING && draw_with_brush)
DeleteBrushFromCursor();
-#if 1
PrintEditorGadgetInfoText(gi);
-#else
- if (gi == NULL || gi->info_text == NULL)
- return;
-
- strncpy(infotext, gi->info_text, max_infotext_len);
- infotext[max_infotext_len] = '\0';
-
- if (gi->custom_id < ED_NUM_CTRL_BUTTONS)
- {
- int key = control_info[gi->custom_id].shortcut;
-
- if (key)
- {
- if (gi->custom_id == GADGET_ID_SINGLE_ITEMS) /* special case 1 */
- sprintf(shortcut, " ('.' or '%c')", key);
- else if (gi->custom_id == GADGET_ID_PICK_ELEMENT) /* special case 2 */
- sprintf(shortcut, " ('%c' or 'Ctrl')", key);
- else if (gi->custom_id == GADGET_ID_TEST) /* special case 3 */
- sprintf(shortcut, " ('Enter' or 'Shift-%c')", key);
- else /* normal case */
- sprintf(shortcut, " ('%s%c')",
- (key >= 'A' && key <= 'Z' ? "Shift-" : ""), key);
-
- if (strlen(infotext) + strlen(shortcut) <= max_infotext_len)
- strcat(infotext, shortcut);
- }
- }
-
- DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FONT_TEXT_2);
-#endif
}
static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, infotext);
}
-void RequestExitLevelEditor(boolean ask_if_level_has_changed)
+void RequestExitLevelEditor(boolean ask_if_level_has_changed,
+ boolean quick_quit)
{
if (!ask_if_level_has_changed ||
!LevelChanged() ||
Request("Level has changed ! Exit without saving ?",
REQ_ASK | REQ_STAY_OPEN))
{
-#if 1
CloseDoor(DOOR_CLOSE_1);
SetDoorState(DOOR_CLOSE_2);
+
+#if 1
+ if (quick_quit)
+ FadeSkipNextFadeIn();
#else
- CloseDoor(DOOR_CLOSE_ALL);
+ if (quick_quit)
+ fading = fading_none;
#endif
+
game_status = GAME_MODE_MAIN;
+#if 1
+ DrawAndFadeInMainMenu(REDRAW_FIELD);
+#else
DrawMainMenu();
+#endif
}
else
{