{ MV_ALONG_RIGHT_SIDE, "along right side" },
{ MV_TURNING_LEFT, "turning left" },
{ MV_TURNING_RIGHT, "turning right" },
+ { MV_TURNING_LEFT_RIGHT, "turning left, right" },
+ { MV_TURNING_RIGHT_LEFT, "turning right, left" },
+ { MV_TURNING_RANDOM, "turning random" },
{ MV_WHEN_PUSHED, "when pushed" },
+ { MV_WHEN_DROPPED, "when dropped" },
+#if 1
+ { MV_MAZE_RUNNER, "maze runner style" },
+ { MV_MAZE_HUNTER, "maze hunter style" },
+#endif
{ -1, NULL }
};
static struct ValueTextInfo options_consistency[] =
{
{ EP_CAN_EXPLODE_3X3, "can explode 3x3" },
+ { EP_CAN_EXPLODE_DYNA, "can explode 3+3" },
{ EP_CAN_EXPLODE_1X1, "can explode 1x1" },
{ EP_INDESTRUCTIBLE, "indestructible" },
{ -1, NULL }
{ CE_LEFT_BY_PLAYER, "left by player ..." },
{ CE_DROPPED_BY_PLAYER, "dropped by player" },
{ CE_SWITCHED, "switched ..." },
- { CE_COLLISION, "collision ..." },
- { CE_IMPACT, "impact" },
- { CE_SMASHED, "smashed" },
+#if 1
+ { CE_HITTING_SOMETHING, "hitting something ..." },
+ { CE_HIT_BY_SOMETHING, "hit by something ..." },
+#else
+ { CE_HITTING_SOMETHING, "collision ..." },
+#endif
+ { CE_IMPACT, "impact (on something)" },
+ { CE_SMASHED, "smashed (from above)" },
{ -1, NULL }
};
{ CE_OTHER_GETS_COLLECTED, "player collects" },
{ CE_OTHER_GETS_DROPPED, "player drops" },
{ CE_OTHER_IS_TOUCHING, "touching ..." },
+#if 1
+ { CE_OTHER_IS_HITTING, "hitting ..." },
+ { CE_OTHER_GETS_HIT, "hit by ..." },
+#endif
{ CE_OTHER_IS_SWITCHING, "switch of ..." },
{ CE_OTHER_IS_CHANGING, "change of" },
{ CE_OTHER_IS_EXPLODING, "explosion of" },
{ CH_SIDE_BOTTOM, "bottom side" },
{ CH_SIDE_LEFT_RIGHT, "left/right side" },
{ CH_SIDE_TOP_BOTTOM, "top/bottom side" },
- { CH_SIDE_ANY, "all sides" },
+ { CH_SIDE_ANY, "any side" },
{ -1, NULL }
};
EL_BD_FIREFLY,
EL_MOLE_LEFT,
+#if 0
+ EL_MAZE_RUNNER,
+#else
EL_EMPTY,
+#endif
EL_MOLE_RIGHT,
EL_PACMAN,
int pos = 0;
int i, j;
- if (editor_elements != NULL)
- free(editor_elements);
+ checked_free(editor_elements);
if (!initialized)
{
(IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE :
CAN_EXPLODE_1X1(element) ? EP_CAN_EXPLODE_1X1 :
CAN_EXPLODE_3X3(element) ? EP_CAN_EXPLODE_3X3 :
+ CAN_EXPLODE_DYNA(element) ? EP_CAN_EXPLODE_DYNA :
custom_element.consistency);
custom_element_properties[EP_EXPLODE_RESULT] =
(IS_INDESTRUCTIBLE(element) ||
CAN_EXPLODE_1X1(element) ||
- CAN_EXPLODE_3X3(element));
+ CAN_EXPLODE_3X3(element) ||
+ CAN_EXPLODE_DYNA(element));
/* special case: sub-settings dependent from main setting */
if (CAN_EXPLODE_BY_FIRE(element))
HAS_CHANGE_EVENT(element, CE_LEFT_BY_PLAYER) ? CE_LEFT_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_DROPPED_BY_PLAYER) ? CE_DROPPED_BY_PLAYER :
HAS_CHANGE_EVENT(element, CE_SWITCHED) ? CE_SWITCHED :
- HAS_CHANGE_EVENT(element, CE_COLLISION) ? CE_COLLISION :
+ HAS_CHANGE_EVENT(element, CE_HITTING_SOMETHING) ? CE_HITTING_SOMETHING :
+ HAS_CHANGE_EVENT(element, CE_HIT_BY_SOMETHING) ? CE_HIT_BY_SOMETHING :
HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT :
HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED :
custom_element_change.direct_action);
HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED :
HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DROPPED) ? CE_OTHER_GETS_DROPPED :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING :
+ HAS_CHANGE_EVENT(element, CE_OTHER_IS_HITTING) ? CE_OTHER_IS_HITTING :
+ HAS_CHANGE_EVENT(element, CE_OTHER_GETS_HIT) ? CE_OTHER_GETS_HIT :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_SWITCHING) ? CE_OTHER_IS_SWITCHING :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING :
HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING :
if (level.use_custom_template)
{
- if (Request("Copy and modify level tem- plate ?", REQ_ASK))
+ if (Request("Copy and modify level template ?", REQ_ASK))
{
level.use_custom_template = FALSE;
ModifyGadget(level_editor_gadget[GADGET_ID_CUSTOM_USE_TEMPLATE],
custom_element_properties[EP_INDESTRUCTIBLE] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_1X1] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_3X3] = FALSE;
+ custom_element_properties[EP_CAN_EXPLODE_DYNA] = 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[EP_EXPLODE_RESULT];
/* special case: sub-settings dependent from main setting */
- if (custom_element_properties[EP_CAN_EXPLODE_3X3] ||
- custom_element_properties[EP_CAN_EXPLODE_1X1])
+ if (custom_element_properties[EP_CAN_EXPLODE_1X1] ||
+ custom_element_properties[EP_CAN_EXPLODE_3X3] ||
+ custom_element_properties[EP_CAN_EXPLODE_DYNA])
{
custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] =
custom_element.can_explode_by_fire;
custom_element_change_events[CE_LEFT_BY_PLAYER] = FALSE;
custom_element_change_events[CE_DROPPED_BY_PLAYER] = FALSE;
custom_element_change_events[CE_SWITCHED] = FALSE;
- custom_element_change_events[CE_COLLISION] = FALSE;
+ custom_element_change_events[CE_HITTING_SOMETHING] = FALSE;
+ custom_element_change_events[CE_HIT_BY_SOMETHING] = FALSE;
custom_element_change_events[CE_IMPACT] = FALSE;
custom_element_change_events[CE_SMASHED] = FALSE;
custom_element_change_events[custom_element_change.direct_action] =
custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE;
custom_element_change_events[CE_OTHER_GETS_DROPPED] = FALSE;
custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE;
+ custom_element_change_events[CE_OTHER_IS_HITTING] = FALSE;
+ custom_element_change_events[CE_OTHER_GETS_HIT] = FALSE;
custom_element_change_events[CE_OTHER_IS_SWITCHING] = FALSE;
custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE;
custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE;
static char *filename = NULL;
char basename[MAX_FILENAME_LEN];
- if (filename != NULL)
- free(filename);
+ checked_free(filename);
/* 1st try: look for element description file for exactly this element */
sprintf(basename, "%s.txt", element_info[element].token_name);
return TRUE;
}
+#if 1
+
+static int PrintElementDescriptionFromFile(char *filename, int start_line)
+{
+ int font_nr = FONT_TEXT_2;
+ int font_width = getFontWidth(font_nr);
+ int font_height = getFontHeight(font_nr);
+ int pad_x = ED_SETTINGS_XPOS(0);
+ int pad_y = ED_SETTINGS_YPOS(0) + ED_BORDER_SIZE;
+ int sx = SX + pad_x;
+ int sy = SY + pad_y + start_line * font_height;
+ 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);
+}
+
+#else
+
static int PrintElementDescriptionFromFile(char *filename, int start_line)
{
int font_nr = FONT_TEXT_2;
return (current_line - start_line);
}
+#endif
+
static void DrawPropertiesTabulatorGadgets()
{
struct GadgetInfo *gd_gi = level_editor_gadget[GADGET_ID_PROPERTIES_INFO];
/* clicking into drawing area with pressed Control key picks element */
if (GetKeyModState() & KMOD_Control)
+ {
+ last_drawing_function = drawing_function;
actual_drawing_function = GADGET_ID_PICK_ELEMENT;
+ }
switch (actual_drawing_function)
{
}
else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE)
{
- boolean new_template = (!LevelFileExists(-1));
+ char *template_filename = getDefaultLevelFilename(-1);
+ boolean new_template = !fileExists(template_filename);
if (new_template ||
- Request("Save this tem- plate and kill the old ?", REQ_ASK))
+ Request("Save this template and kill the old ?", REQ_ASK))
SaveLevelTemplate();
if (new_template)
- Request("Tem- plate saved !", REQ_CONFIRM);
+ Request("Template saved !", REQ_CONFIRM);
}
else if (type_id == ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE &&
custom_element.num_change_pages < MAX_CHANGE_PAGES)
}
else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE)
{
- if (level.use_custom_template && !LevelFileExists(-1))
+ char *template_filename = getDefaultLevelFilename(-1);
+
+ if (level.use_custom_template && !fileExists(template_filename))
{
- Request("No level tem- plate found !", REQ_CONFIRM);
+ Request("No level template found !", REQ_CONFIRM);
level.use_custom_template = FALSE;
ModifyGadget(gi, GDI_CHECKED, FALSE, GDI_END);
Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM);
else
{
- boolean new_level = (!LevelFileExists(level_nr));
+ char *level_filename = getDefaultLevelFilename(level_nr);
+ boolean new_level = !fileExists(level_filename);
if (new_level ||
Request("Save this level and kill the old ?", REQ_ASK))