#define GADGET_ID_TIME_OR_STEPS (GADGET_ID_SELECTBOX_FIRST + 0)
#define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 1)
-#define GADGET_ID_CUSTOM_CONSISTENCY (GADGET_ID_SELECTBOX_FIRST + 2)
+#define GADGET_ID_CUSTOM_EXPLOSION_TYPE (GADGET_ID_SELECTBOX_FIRST + 2)
#define GADGET_ID_CUSTOM_DEADLINESS (GADGET_ID_SELECTBOX_FIRST + 3)
#define GADGET_ID_CUSTOM_MOVE_PATTERN (GADGET_ID_SELECTBOX_FIRST + 4)
#define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 5)
#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 13)
#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 14)
#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 38)
/* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 39)
#define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \
ED_NUM_ELEMENTLIST_BUTTONS - 1)
#define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM
#define ED_COUNTER_ID_CUSTOM1_FIRST ED_COUNTER_ID_CUSTOM_SCORE
-#define ED_COUNTER_ID_CUSTOM1_LAST ED_COUNTER_ID_MOVE_DELAY_RND
-#define ED_COUNTER_ID_CUSTOM2_FIRST ED_COUNTER_ID_EXPLOSION_DELAY
+#define ED_COUNTER_ID_CUSTOM1_LAST ED_COUNTER_ID_DROP_DELAY_RND
+#define ED_COUNTER_ID_CUSTOM2_FIRST ED_COUNTER_ID_MOVE_DELAY_FIX
#define ED_COUNTER_ID_CUSTOM2_LAST ED_COUNTER_ID_IGNITION_DELAY
#define ED_COUNTER_ID_CUSTOM_FIRST ED_COUNTER_ID_CUSTOM1_FIRST
#define ED_COUNTER_ID_CUSTOM_LAST ED_COUNTER_ID_CUSTOM2_LAST
#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 10
#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 11
#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 12
-#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 13
+#define ED_SELECTBOX_ID_CUSTOM_EXPLOSION_TYPE 13
#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 14
#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 15
#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 16
#define ED_SELECTBOX_ID_LEVEL_LAST ED_SELECTBOX_ID_TIME_OR_STEPS
#define ED_SELECTBOX_ID_CUSTOM1_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
-#define ED_SELECTBOX_ID_CUSTOM1_LAST ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE
-#define ED_SELECTBOX_ID_CUSTOM2_FIRST ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS
-#define ED_SELECTBOX_ID_CUSTOM2_LAST ED_SELECTBOX_ID_CUSTOM_CONSISTENCY
+#define ED_SELECTBOX_ID_CUSTOM1_LAST ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION
+#define ED_SELECTBOX_ID_CUSTOM2_FIRST ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN
+#define ED_SELECTBOX_ID_CUSTOM2_LAST ED_SELECTBOX_ID_CUSTOM_EXPLOSION_TYPE
#define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM1_FIRST
#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM2_LAST
#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 14
#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 15
#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 16
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 17
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 18
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 19
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 20
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 21
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 22
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 23
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 24
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 25
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 26
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 27
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY 28
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 29
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 30
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 31
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 32
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 33
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 34
-
-#define ED_NUM_CHECKBUTTONS 35
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 17
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 18
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 19
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 20
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 21
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 22
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 23
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 24
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 25
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 26
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 27
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 28
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 29
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY 30
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 31
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 32
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 33
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 34
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 35
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 36
+
+#define ED_NUM_CHECKBUTTONS 37
#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED
#define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
#define ED_CHECKBUTTON_ID_CUSTOM1_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC
-#define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE
-#define ED_CHECKBUTTON_ID_CUSTOM2_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL
+#define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE
+#define ED_CHECKBUTTON_ID_CUSTOM2_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE
#define ED_CHECKBUTTON_ID_CUSTOM2_LAST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT
#define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM1_FIRST
#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM2_LAST
&custom_element.drop_delay_random,
NULL, "+random", NULL
},
+
+ /* ---------- element settings: configure 2 (custom elements) ------------ */
+
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5),
0, 999,
GADGET_ID_MOVE_DELAY_FIX_DOWN, GADGET_ID_MOVE_DELAY_FIX_UP,
GADGET_ID_MOVE_DELAY_FIX_TEXT, GADGET_ID_NONE,
NULL, "move delay", NULL
},
{
- -1, ED_SETTINGS_YPOS(13),
+ -1, ED_SETTINGS_YPOS(5),
0, 999,
GADGET_ID_MOVE_DELAY_RND_DOWN, GADGET_ID_MOVE_DELAY_RND_UP,
GADGET_ID_MOVE_DELAY_RND_TEXT, GADGET_ID_MOVE_DELAY_FIX_UP,
&custom_element.move_delay_random,
NULL, "+random", NULL
},
-
- /* ---------- element settings: configure 2 (custom elements) ------------ */
-
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(4),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12),
0, 255,
GADGET_ID_EXPLOSION_DELAY_DOWN, GADGET_ID_EXPLOSION_DELAY_UP,
GADGET_ID_EXPLOSION_DELAY_TEXT, GADGET_ID_NONE,
NULL, "explosion delay", NULL
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13),
0, 255,
GADGET_ID_IGNITION_DELAY_DOWN, GADGET_ID_IGNITION_DELAY_UP,
GADGET_ID_IGNITION_DELAY_TEXT, GADGET_ID_NONE,
{ -1, NULL }
};
-static struct ValueTextInfo options_consistency[] =
+static struct ValueTextInfo options_explosion_type[] =
{
- { EP_CAN_EXPLODE_3X3, "can explode 3x3" },
- { EP_CAN_EXPLODE_CROSS, "can explode 3+3" },
- { EP_CAN_EXPLODE_1X1, "can explode 1x1" },
+ { EXPLODES_3X3, "3x3" },
+ { EXPLODES_CROSS, "3+3" },
+ { EXPLODES_1X1, "1x1" },
+#if 0
{ EP_INDESTRUCTIBLE, "indestructible" },
+#endif
{ -1, NULL }
};
#else
{ CE_HITTING_SOMETHING, "collision" },
#endif
-#if 1
+
+#if 0
{ CE_BLOCKED, "blocked" },
#endif
+
{ CE_IMPACT, "impact (on something)" },
{ CE_SMASHED, "smashed (from above)" },
static struct ValueTextInfo options_change_replace_when[] =
{
{ CP_WHEN_EMPTY, "empty" },
+ { CP_WHEN_WALKABLE, "walkable" },
{ CP_WHEN_DIGGABLE, "diggable" },
{ CP_WHEN_COLLECTIBLE, "collectible" },
{ CP_WHEN_REMOVABLE, "removable" },
&custom_element.walk_to_action,
NULL, NULL, "diggable/collectible/pushable"
},
+
+ /* ---------- element settings: configure 2 (custom elements) ----------- */
+
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(1),
GADGET_ID_CUSTOM_MOVE_PATTERN, GADGET_ID_NONE,
-1,
options_move_pattern,
&custom_element.move_pattern,
- "can move", NULL, "element move direction"
+ "can move", NULL, "element move pattern"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(2),
GADGET_ID_CUSTOM_MOVE_DIRECTION, GADGET_ID_NONE,
-1,
options_move_direction,
"starts moving", NULL, "initial element move direction"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(4),
GADGET_ID_CUSTOM_MOVE_STEPSIZE, GADGET_ID_NONE,
-1,
options_move_stepsize,
"move/fall speed", NULL, "speed of element movement"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3),
GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, GADGET_ID_NONE,
-1,
options_move_leave_type,
"can dig: can", ":", "leave behind or change element"
},
{
- -1, ED_SETTINGS_YPOS(13),
+ -1, ED_SETTINGS_YPOS(7),
GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH,
-1,
options_smash_targets,
"can smash", NULL, "elements that can be smashed"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(14),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8),
GADGET_ID_CUSTOM_SLIPPERY_TYPE, GADGET_ID_NONE,
-1,
options_slippery_type,
&custom_element.slippery_type,
"slippery", NULL, "where other elements fall down"
},
-
- /* ---------- element settings: configure 2 (custom elements) ----------- */
-
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(1),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_DEADLINESS, GADGET_ID_NONE,
-1,
options_deadliness,
"deadly when", NULL, "deadliness of element"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(2),
- GADGET_ID_CUSTOM_CONSISTENCY, GADGET_ID_NONE,
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10),
+ GADGET_ID_CUSTOM_EXPLOSION_TYPE, GADGET_ID_NONE,
-1,
- options_consistency,
- &custom_element.consistency,
- NULL, NULL, "consistency/destructibility"
+ options_explosion_type,
+ &custom_element.explosion_type,
+ "can explode", NULL, "explosion type"
},
/* ---------- element settings: advanced (custom elements) --------------- */
ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1),
GADGET_ID_CUSTOM_USE_GRAPHIC, GADGET_ID_NONE,
&custom_element.use_gfx_element,
- NULL, "use graphic of element:", "use graphic for custom element"
+#if 0
+ NULL, "use graphic/sound of element:", "use existing graphic and sound"
+#else
+ NULL, "use graphic of element:", "use existing element graphic"
+#endif
},
{
ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2),
&custom_element_properties[EP_ACCESSIBLE],
NULL, NULL, "player can walk to or pass this field"
},
+ {
+ ED_SETTINGS_XPOS(0), ED_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"
+ },
{
ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(5),
GADGET_ID_CUSTOM_WALK_TO_OBJECT, GADGET_ID_NONE,
},
{
ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(9),
+ GADGET_ID_CUSTOM_INDESTRUCTIBLE, GADGET_ID_NONE,
+ &custom_element_properties[EP_INDESTRUCTIBLE],
+ NULL, "indestructible", "element is indestructible"
+ },
+
+ /* ---------- element settings: configure 2 (custom elements) ----------- */
+
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1),
GADGET_ID_CUSTOM_CAN_MOVE, GADGET_ID_NONE,
&custom_element_properties[EP_CAN_MOVE],
- NULL, NULL, "element can move in some direction"
+ NULL, NULL, "element can move with some pattern"
},
{
- ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13),
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(7),
GADGET_ID_CUSTOM_CAN_FALL, GADGET_ID_NONE,
&custom_element_properties[EP_CAN_FALL],
NULL, "can fall", "element can fall down"
},
{
- -1, ED_SETTINGS_YPOS(13),
+ -1, ED_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"
},
{
- ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(14),
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(8),
GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE,
&custom_element_properties[EP_SLIPPERY],
NULL, NULL, "other elements can fall down from it"
},
-
- /* ---------- element settings: configure 2 (custom elements) ----------- */
-
{
- ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1),
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_DEADLY, GADGET_ID_NONE,
&custom_element_properties[EP_DEADLY],
NULL, NULL, "element can kill the player"
},
{
- ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2),
- GADGET_ID_CUSTOM_EXPLODE_RESULT, GADGET_ID_NONE,
- &custom_element_properties[EP_EXPLODE_RESULT],
- NULL, NULL, "set consistency/destructibility"
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10),
+ GADGET_ID_CUSTOM_CAN_EXPLODE, GADGET_ID_NONE,
+ &custom_element_properties[EP_CAN_EXPLODE],
+ NULL, NULL, "element can explode"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11),
GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE,
- &custom_element.can_explode_by_fire,
+ &custom_element_properties[EP_EXPLODES_BY_FIRE],
NULL, "by fire", "element can explode by fire/explosion"
},
{
- -1, ED_SETTINGS_YPOS(3),
+ -1, ED_SETTINGS_YPOS(11),
GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE,
- &custom_element.can_explode_smashed,
+ &custom_element_properties[EP_EXPLODES_SMASHED],
" ", "smashed", "element can explode when smashed"
},
{
- -1, ED_SETTINGS_YPOS(3),
+ -1, ED_SETTINGS_YPOS(11),
GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH,
- &custom_element.can_explode_impact,
+ &custom_element_properties[EP_EXPLODES_IMPACT],
" ", "impact", "element can explode on impact"
},
"content:", NULL, NULL
},
+ /* ---------- element settings: configure 1 (custom elements) ----------- */
+
/* ---------- custom graphic --------------------------------------------- */
{
NULL, NULL, NULL
},
+ /* ---------- element settings: configure 2 (custom elements) ----------- */
+
/* ---------- custom content (when exploding) ---------------------------- */
{
- -1, ED_AREA_3X3_SETTINGS_YPOS(2),
+ -1, ED_AREA_3X3_SETTINGS_YPOS(10),
3, 3,
GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, /* align three rows */
"content:", NULL, NULL
/* ---------- custom enter and leave element (when moving) --------------- */
{
- ED_AREA_1X1_SETTINGS_XPOS(1), ED_AREA_1X1_SETTINGS_YPOS(11),
+ ED_AREA_1X1_SETTINGS_XPOS(1), ED_AREA_1X1_SETTINGS_YPOS(3),
1, 1,
GADGET_ID_CUSTOM_MOVE_ENTER, GADGET_ID_NONE,
"can dig:", " ", NULL
},
{
- -1, ED_AREA_1X1_SETTINGS_YPOS(11),
+ -1, ED_AREA_1X1_SETTINGS_YPOS(3),
1, 1,
GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,
NULL, NULL, NULL
},
+ /* ---------- element settings: advanced (custom elements) --------------- */
+
/* ---------- custom change target --------------------------------------- */
{
int xoffset_left = getTextWidthForGadget(checkbutton_info[id].text_left);
int xoffset_right = ED_GADGET_TEXT_DISTANCE;
int yoffset = ED_BORDER_SIZE;
- int x_left = gi->x - xoffset_left;
- int x_right = gi->x + gi->width + xoffset_right;
- int y; /* set after gadget position was modified */
+ int x_left, x_right, y; /* set after gadget position was modified */
- /* set position for gadgets with dynamically determined vertical position */
+ /* set position for gadgets with dynamically determined position */
+ if (checkbutton_info[id].x != -1) /* do not change dynamic positions */
+ ModifyGadget(gi, GDI_X, SX + checkbutton_info[id].x, GDI_END);
ModifyGadget(gi, GDI_Y, SY + checkbutton_info[id].y, GDI_END);
+ x_left = gi->x - xoffset_left;
+ x_right = gi->x + gi->width + xoffset_right;
y = gi->y + yoffset;
if (checkbutton_info[id].text_left)
undo_buffer_position = -1;
undo_buffer_steps = -1;
CopyLevelToUndoBuffer(UNDO_IMMEDIATE);
+
+ level.changed = FALSE;
}
static void DrawEditModeWindow()
static boolean LevelChanged()
{
- boolean level_changed = FALSE;
+ boolean field_changed = FALSE;
int x, y;
+ if (leveldir_current->readonly)
+ return FALSE;
+
for (y = 0; y < lev_fieldy; y++)
for (x = 0; x < lev_fieldx; x++)
if (Feld[x][y] != level.field[x][y])
- level_changed = TRUE;
+ field_changed = TRUE;
- return level_changed;
+ return (level.changed || field_changed);
}
static boolean LevelContainsPlayer()
boolean player_found = FALSE;
int x, y;
+ return TRUE; /* !!! CURRENTLY DEACTIVATED !!! */
+
for (y = 0; y < lev_fieldy; y++)
for (x = 0; x < lev_fieldx; x++)
if (Feld[x][y] == EL_PLAYER_1 ||
for (x = 0; x < 3; x++)
ei_to->content[x][y] = ei_from->content[x][y];
+ ei_to->explosion_type = ei_from->explosion_type;
ei_to->explosion_delay = ei_from->explosion_delay;
ei_to->ignition_delay = ei_from->ignition_delay;
element_old = (IS_CUSTOM_ELEMENT(element_new) ?
EL_INTERNAL_CLIPBOARD_CUSTOM : EL_INTERNAL_CLIPBOARD_GROUP);
copy_mode = GADGET_ID_CUSTOM_COPY_TO;
+
+ level.changed = TRUE;
}
else if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new))
{
return FALSE;
}
+ else
+ {
+ level.changed = TRUE;
+ }
if (copy_mode == GADGET_ID_CUSTOM_COPY_FROM)
{
DONT_COLLIDE_WITH(element) ||
DONT_RUN_INTO(element));
- /* set consistency selectbox help value */
- custom_element.consistency =
- (IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE :
+#if 0
+ /* set explosion type selectbox help value */
+ custom_element.explosion_type =
+ (
+#if 0
+ IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE :
+#endif
CAN_EXPLODE_1X1(element) ? EP_CAN_EXPLODE_1X1 :
CAN_EXPLODE_3X3(element) ? EP_CAN_EXPLODE_3X3 :
CAN_EXPLODE_CROSS(element) ? EP_CAN_EXPLODE_CROSS :
- custom_element.consistency);
- custom_element_properties[EP_EXPLODE_RESULT] =
- (IS_INDESTRUCTIBLE(element) ||
+ custom_element.explosion_type);
+ custom_element_properties[EP_CAN_EXPLODE_AT_ALL] =
+ (
+#if 0
+ IS_INDESTRUCTIBLE(element) ||
+#endif
CAN_EXPLODE_1X1(element) ||
CAN_EXPLODE_3X3(element) ||
CAN_EXPLODE_CROSS(element));
+#endif
+#if 0
/* special case: sub-settings dependent from main setting */
+#if 0
+ custom_element.can_explode_by_fire = CAN_EXPLODE_BY_FIRE(element);
+ custom_element.can_explode_smashed = CAN_EXPLODE_SMASHED(element);
+ custom_element.can_explode_impact = CAN_EXPLODE_IMPACT(element);
+#else
if (CAN_EXPLODE_BY_FIRE(element))
custom_element.can_explode_by_fire = TRUE;
if (CAN_EXPLODE_SMASHED(element))
custom_element.can_explode_smashed = TRUE;
if (CAN_EXPLODE_IMPACT(element))
custom_element.can_explode_impact = TRUE;
+#endif
+#endif
/* ---------- element settings: advanced (custom elements) --------------- */
{
int i;
int access_type_and_layer;
+#if 0
+ boolean can_explode;
+#endif
/* mark that this custom element has been modified */
custom_element.modified_settings = TRUE;
+ level.changed = TRUE;
if (level.use_custom_template)
{
custom_element_properties[custom_element.deadliness] =
custom_element_properties[EP_DEADLY];
- /* set consistency property from checkbox and selectbox */
+#if 0
+ /* set explosion type property from checkbox and selectbox */
+#if 0
custom_element_properties[EP_INDESTRUCTIBLE] = FALSE;
+#endif
custom_element_properties[EP_CAN_EXPLODE_1X1] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_3X3] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_CROSS] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_SMASHED] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_IMPACT] = FALSE;
- custom_element_properties[custom_element.consistency] =
- custom_element_properties[EP_EXPLODE_RESULT];
+ custom_element_properties[custom_element.explosion_type] =
+ custom_element_properties[EP_CAN_EXPLODE_AT_ALL];
+#endif
+#if 0
/* special case: sub-settings dependent from main setting */
+#if 0
+ can_explode = (custom_element_properties[EP_CAN_EXPLODE_1X1] ||
+ custom_element_properties[EP_CAN_EXPLODE_3X3] ||
+ custom_element_properties[EP_CAN_EXPLODE_CROSS]);
+ custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] =
+ (can_explode && custom_element.can_explode_by_fire);
+ custom_element_properties[EP_CAN_EXPLODE_SMASHED] =
+ (can_explode && custom_element.can_explode_smashed);
+ custom_element_properties[EP_CAN_EXPLODE_IMPACT] =
+ (can_explode && custom_element.can_explode_impact);
+#else
if (custom_element_properties[EP_CAN_EXPLODE_1X1] ||
custom_element_properties[EP_CAN_EXPLODE_3X3] ||
custom_element_properties[EP_CAN_EXPLODE_CROSS])
custom_element_properties[EP_CAN_EXPLODE_IMPACT] =
custom_element.can_explode_impact;
}
+#endif
+#endif
/* ---------- element settings: advanced (custom elements) --------------- */
/* mark that this group element has been modified */
element_info[element].modified_settings = TRUE;
+ level.changed = TRUE;
}
static void CopyClassicElementPropertiesToGame(int element)
int id = ED_DRAWING_ID_CUSTOM_CONTENT;
struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id];
int x1 = right_gadget_border[GADGET_ID_CUSTOM_DEADLINESS];
- int x2 = right_gadget_border[GADGET_ID_CUSTOM_CONSISTENCY];
+ int x2 = right_gadget_border[GADGET_ID_CUSTOM_EXPLOSION_TYPE];
int x3 = right_gadget_border[GADGET_ID_CUSTOM_EXPLODE_IMPACT];
int xoffset = ED_DRAWINGAREA_TEXT_DISTANCE;
edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2))
{
/* set position for checkbutton for "can move into acid" */
+ checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].x =
+ ED_SETTINGS_XPOS(IS_CUSTOM_ELEMENT(properties_element) ? 1 : 0);
checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y =
ED_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 :
HAS_CONTENT(properties_element) ? 1 : 0);
/* draw drawing area gadgets */
MapDrawingArea(ED_DRAWING_ID_CUSTOM_GRAPHIC);
- MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_ENTER);
- MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_LEAVE);
}
else if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2)
{
MapSelectboxGadget(i);
/* draw drawing area gadgets */
+ MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_ENTER);
+ MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_LEAVE);
DrawCustomContentArea();
}
}
DrawLevelText(start_sx, sy + 1, 0, TEXT_SETCURSOR);
else
DrawLevelText(0, 0, 0, TEXT_END);
+
+ level.changed = TRUE;
}
break;
SetBorderElement();
if (BorderElement != last_border_element)
DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+
+ level.changed = TRUE;
}
static void RandomPlacement(int new_element)
{
static boolean free_position[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
- int num_free_positions;
- int num_percentage;
- int num_elements;
+ int num_free_positions = 0;
+ int num_percentage, num_elements;
int x, y;
- /* determine number of free positions for the new elements */
- /* (maybe this statement should be formatted a bit more readable...) */
- num_free_positions = 0;
- for (x = 0; x < lev_fieldx; x++)
- for (y = 0; y < lev_fieldy; y++)
- if ((free_position[x][y] =
- ((random_placement_background_restricted &&
- Feld[x][y] == random_placement_background_element) ||
- (!random_placement_background_restricted &&
- Feld[x][y] != new_element))) == TRUE)
- num_free_positions++;
+ /* 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++)
+ {
+ free_position[x][y] =
+ (random_placement_background_restricted ?
+ Feld[x][y] == random_placement_background_element :
+ Feld[x][y] != new_element);
+
+ if (free_position[x][y])
+ num_free_positions++;
+ }
/* determine number of new elements to place there */
num_percentage = num_free_positions * random_placement_value / 100;
num_elements = (random_placement_method == RANDOM_USE_PERCENTAGE ?
num_percentage : random_placement_value);
- /* if not more free positions than elements to place, fill whole level */
- if (num_elements >= num_free_positions)
+ /* if less free positions than elements to place, fill all these positions */
+ if (num_free_positions < num_elements)
{
for (x = 0; x < lev_fieldx; x++)
for (y = 0; y < lev_fieldy; y++)
- Feld[x][y] = new_element;
-
- DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
- CopyLevelToUndoBuffer(UNDO_IMMEDIATE);
- return;
+ if (free_position[x][y])
+ Feld[x][y] = new_element;
}
-
- while (num_elements > 0)
+ else
{
- x = RND(lev_fieldx);
- y = RND(lev_fieldy);
-
- /* don't place element at the same position twice */
- if (free_position[x][y])
+ while (num_elements > 0)
{
- free_position[x][y] = FALSE;
- Feld[x][y] = new_element;
- num_elements--;
+ x = RND(lev_fieldx);
+ y = RND(lev_fieldy);
+
+ /* don't place element at the same position twice */
+ if (free_position[x][y])
+ {
+ free_position[x][y] = FALSE;
+ Feld[x][y] = new_element;
+ num_elements--;
+ }
}
}
{
if (gadget_id == counterbutton_info[counter_id].gadget_id_text)
ModifyEditorCounter(counter_id, *counter_value);
+
return;
}
}
else
ModifyEditorCounter(counter_id, *counter_value + step);
+ if (counter_id == ED_COUNTER_ID_SELECT_LEVEL)
+ {
+ LoadLevel(level_nr);
+ TapeErase();
+ ResetUndoBuffer();
+ DrawEditModeWindow();
+
+ return;
+ }
+
switch (counter_id)
{
case ED_COUNTER_ID_ELEMENT_CONTENT:
lev_fieldy = level.fieldy;
break;
- case ED_COUNTER_ID_SELECT_LEVEL:
- LoadLevel(level_nr);
- TapeErase();
- ResetUndoBuffer();
- DrawEditModeWindow();
- break;
-
default:
break;
}
(counter_id >= ED_COUNTER_ID_CHANGE_FIRST &&
counter_id <= ED_COUNTER_ID_CHANGE_LAST))
CopyElementPropertiesToGame(properties_element);
+
+ level.changed = TRUE;
}
static void HandleTextInputGadgets(struct GadgetInfo *gi)
ModifyEditorElementList(); /* update changed button info text */
}
+
+ level.changed = TRUE;
}
static void HandleTextAreaGadgets(struct GadgetInfo *gi)
int type_id = gi->custom_type_id;
strcpy(textarea_info[type_id].value, gi->textarea.value);
+
+ level.changed = TRUE;
}
static void HandleSelectboxGadgets(struct GadgetInfo *gi)
(type_id >= ED_SELECTBOX_ID_CHANGE_FIRST &&
type_id <= ED_SELECTBOX_ID_CHANGE_LAST) ||
(type_id == ED_SELECTBOX_ID_GROUP_CHOICE_MODE))
+ {
CopyElementPropertiesToGame(properties_element);
+
+ level.changed = TRUE;
+ }
}
static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
setElementChangeInfoToDefaults(ei->change);
DrawPropertiesWindow();
+
+ level.changed = TRUE;
}
else if (type_id == ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE &&
custom_element.num_change_pages > MIN_CHANGE_PAGES)
setElementChangePages(ei, ei->num_change_pages - 1);
DrawPropertiesWindow();
+
+ level.changed = TRUE;
}
}
element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0] =
ei->change_page[current_change_page];
else if (type_id == ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE)
+ {
ei->change_page[current_change_page] =
element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0];
+ level.changed = TRUE;
+ }
+
DrawPropertiesWindow();
}
}
{
*radiobutton_info[gi->custom_type_id].value =
radiobutton_info[gi->custom_type_id].checked_value;
+
+ level.changed = TRUE;
}
static void HandleCheckbuttons(struct GadgetInfo *gi)
DrawEditModeWindow();
}
+
+ level.changed = TRUE;
}
static void HandleControlButtons(struct GadgetInfo *gi)
for (x = 0; x < MAX_LEV_FIELDX; x++)
for (y = 0; y < MAX_LEV_FIELDY; y++)
Feld[x][y] = (button == 1 ? EL_EMPTY : new_element);
+
CopyLevelToUndoBuffer(GADGET_ID_CLEAR);
DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
break;
}
- if (!LevelContainsPlayer)
+ if (!LevelContainsPlayer())
Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM);
else
{
if (new_level)
Request("Level saved !", REQ_CONFIRM);
+
+ level.changed = FALSE;
}
break;
case GADGET_ID_TEST:
- if (!LevelContainsPlayer)
+ if (!LevelContainsPlayer())
Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM);
else
{
{
RequestExitLevelEditor(setup.ask_on_escape);
}
- else
+ else if (edit_mode == ED_MODE_INFO)
+ {
+ HandleControlButtons(level_editor_gadget[GADGET_ID_INFO]);
+ }
+ else if (edit_mode == ED_MODE_PROPERTIES)
+ {
+ HandleControlButtons(level_editor_gadget[GADGET_ID_PROPERTIES]);
+ }
+ else /* should never happen */
{
DrawDrawingWindow();
edit_mode = ED_MODE_DRAWING;
else
{
CloseDoor(DOOR_CLOSE_1);
- BlitBitmap(bitmap_db_door, bitmap_db_door,
- DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE,DYSIZE,
- DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
- OpenDoor(DOOR_OPEN_1);
+ OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
}
}