#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_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#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 + 38)
+#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_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_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_INDESTRUCTIBLE 23
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 24
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 25
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 26
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 27
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 28
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY 29
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 30
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 31
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 32
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 33
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 34
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 35
-
-#define ED_NUM_CHECKBUTTONS 36
+#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,
#else
{ CE_HITTING_SOMETHING, "collision" },
#endif
-#if 1
+
+#if 0
{ CE_BLOCKED, "blocked" },
#endif
+
{ CE_IMPACT, "impact (on something)" },
{ CE_SMASHED, "smashed (from above)" },
&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),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10),
GADGET_ID_CUSTOM_EXPLOSION_TYPE, GADGET_ID_NONE,
-1,
options_explosion_type,
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(6),
- GADGET_ID_CUSTOM_INDESTRUCTIBLE, GADGET_ID_NONE,
- &custom_element_properties[EP_INDESTRUCTIBLE],
- NULL, "indestructible", "element is indestructible"
- },
- {
- ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2),
+ 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_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_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_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)
{
/* mark that this custom element has been modified */
custom_element.modified_settings = TRUE;
+ level.changed = TRUE;
if (level.use_custom_template)
{
/* mark that this group element has been modified */
element_info[element].modified_settings = TRUE;
+ level.changed = TRUE;
}
static void CopyClassicElementPropertiesToGame(int element)
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) ? 7 :
+ ED_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 :
HAS_CONTENT(properties_element) ? 1 : 0);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID);
/* 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);
}
}