#define ED_TEXTBUTTON_XSIZE ED_WIN_COUNT_XSIZE
#define ED_TEXTBUTTON_YSIZE ED_WIN_COUNT_YSIZE
-/* values for ClearEditorGadgetInfoText() and HandleGadgetInfoText() */
+/* values for ClearEditorGadgetInfoText() and HandleEditorGadgetInfoText() */
#define INFOTEXT_XPOS SX
#define INFOTEXT_YPOS (SY + SYSIZE - MINI_TILEX + 2)
#define INFOTEXT_XSIZE SXSIZE
static void HandleCheckbuttons(struct GadgetInfo *);
static void HandleControlButtons(struct GadgetInfo *);
static void HandleDrawingAreaInfo(struct GadgetInfo *);
+static void PrintEditorGadgetInfoText(struct GadgetInfo *);
static struct GadgetInfo *level_editor_gadget[NUM_EDITOR_GADGETS];
static int right_gadget_border[NUM_EDITOR_GADGETS];
static int editor_hl_boulderdash[] =
{
+ EL_INTERNAL_CASCADE_BD_ACTIVE,
+ EL_CHAR('B'),
+ EL_CHAR('D'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('B'),
EL_CHAR('O'),
EL_CHAR('U'),
EL_CHAR('A'),
EL_CHAR('S'),
EL_CHAR('H'),
+#endif
};
static int editor_el_boulderdash[] =
static int editor_hl_emerald_mine[] =
{
+ EL_INTERNAL_CASCADE_EM_ACTIVE,
+ EL_CHAR('E'),
+ EL_CHAR('M'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('E'),
EL_CHAR('M'),
EL_CHAR('E'),
EL_CHAR('I'),
EL_CHAR('N'),
EL_CHAR('E'),
+#endif
};
static int editor_el_emerald_mine[] =
static int editor_hl_emerald_mine_club[] =
{
+ EL_INTERNAL_CASCADE_EMC_ACTIVE,
+ EL_CHAR('E'),
+ EL_CHAR('M'),
+ EL_CHAR('C'),
+
+#if 0
EL_CHAR('E'),
EL_CHAR('M'),
EL_CHAR('E'),
EL_CHAR('L'),
EL_CHAR('U'),
EL_CHAR('B'),
+#endif
};
static int editor_el_emerald_mine_club[] =
static int editor_hl_more[] =
{
+ 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_el_more[] =
static int editor_hl_sokoban[] =
{
+ EL_INTERNAL_CASCADE_SB_ACTIVE,
+ EL_CHAR('S'),
+ EL_CHAR('B'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('S'),
EL_CHAR('O'),
EL_CHAR('K'),
EL_CHAR('B'),
EL_CHAR('A'),
EL_CHAR('N'),
+#endif
};
static int editor_el_sokoban[] =
static int editor_hl_supaplex[] =
{
+ EL_INTERNAL_CASCADE_SP_ACTIVE,
+ EL_CHAR('S'),
+ EL_CHAR('P'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('S'),
EL_CHAR('U'),
EL_CHAR('P'),
EL_CHAR('L'),
EL_CHAR('E'),
EL_CHAR('X'),
+#endif
};
static 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('I'),
EL_CHAR('I'),
+#endif
};
static int editor_el_diamond_caves[] =
static int editor_hl_dx_boulderdash[] =
{
+ EL_INTERNAL_CASCADE_DX_ACTIVE,
+ EL_CHAR('D'),
+ EL_CHAR('X'),
+ EL_EMPTY,
+
+#if 0
EL_CHAR('D'),
EL_CHAR('X'),
EL_CHAR('-'),
EL_CHAR('A'),
EL_CHAR('S'),
EL_CHAR('H'),
+#endif
};
static int editor_el_dx_boulderdash[] =
static int editor_hl_chars[] =
{
+ EL_INTERNAL_CASCADE_TEXT_ACTIVE,
+ 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[] =
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('N'),
EL_CHAR('T'),
EL_CHAR('S'),
+#endif
};
static int editor_el_custom[] =
EL_CUSTOM_START + 124,
EL_CUSTOM_START + 125,
EL_CUSTOM_START + 126,
- EL_CUSTOM_START + 127
-};
-static int *editor_hl_custom_ptr = editor_hl_custom;
-static int *editor_el_custom_ptr = 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_custom_more[] =
-{
-};
+ EL_CUSTOM_START + 127,
-static int editor_el_custom_more[] =
-{
EL_CUSTOM_START + 128,
EL_CUSTOM_START + 129,
EL_CUSTOM_START + 130,
EL_CUSTOM_START + 252,
EL_CUSTOM_START + 253,
EL_CUSTOM_START + 254,
- EL_CUSTOM_START + 255
-};
-static int *editor_hl_custom_more_ptr = editor_hl_custom_more;
-static int *editor_el_custom_more_ptr = editor_el_custom_more;
-static int num_editor_hl_custom_more = SIZEOF_ARRAY_INT(editor_hl_custom_more);
-static int num_editor_el_custom_more = SIZEOF_ARRAY_INT(editor_el_custom_more);
+ EL_CUSTOM_START + 255,
-static int editor_hl_custom_special[] =
-{
-};
-
-static int editor_el_custom_special[] =
-{
EL_TRIGGER_ELEMENT,
EL_TRIGGER_PLAYER,
EL_EMPTY,
EL_EMPTY
};
-static int *editor_hl_custom_special_ptr = editor_hl_custom_special;
-static int *editor_el_custom_special_ptr = editor_el_custom_special;
-static int num_editor_hl_custom_special = SIZEOF_ARRAY_INT(editor_hl_custom_special);
-static int num_editor_el_custom_special = SIZEOF_ARRAY_INT(editor_el_custom_special);
+static int *editor_hl_custom_ptr = editor_hl_custom;
+static int *editor_el_custom_ptr = 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_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('N'),
EL_CHAR('T'),
EL_CHAR('S'),
+#endif
};
static int editor_el_group[] =
EL_GROUP_START + 12,
EL_GROUP_START + 13,
EL_GROUP_START + 14,
- EL_GROUP_START + 15
-};
-static int *editor_hl_group_ptr = editor_hl_group;
-static int *editor_el_group_ptr = 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_group_more[] =
-{
-};
+ EL_GROUP_START + 15,
-static int editor_el_group_more[] =
-{
EL_GROUP_START + 16,
EL_GROUP_START + 17,
EL_GROUP_START + 18,
EL_GROUP_START + 30,
EL_GROUP_START + 31
};
-static int *editor_hl_group_more_ptr = editor_hl_group_more;
-static int *editor_el_group_more_ptr = editor_el_group_more;
-static int num_editor_hl_group_more = SIZEOF_ARRAY_INT(editor_hl_group_more);
-static int num_editor_el_group_more = SIZEOF_ARRAY_INT(editor_el_group_more);
+static int *editor_hl_group_ptr = editor_hl_group;
+static int *editor_el_group_ptr = 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_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('N'),
EL_CHAR('E'),
EL_CHAR('D'),
+#endif
};
static int *editor_hl_user_defined_ptr = editor_hl_user_defined;
static int num_editor_hl_user_defined=SIZEOF_ARRAY_INT(editor_hl_user_defined);
static int num_editor_el_user_defined = 0;
+static int editor_hl_dynamic[] =
+{
+ EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE,
+ EL_CHAR('D'),
+ EL_CHAR('Y'),
+ EL_CHAR('N'),
+};
+
+static int *editor_hl_dynamic_ptr = editor_hl_dynamic;
+static int *editor_el_dynamic_ptr = NULL;
+static int num_editor_hl_dynamic = SIZEOF_ARRAY_INT(editor_hl_dynamic);
+static int num_editor_el_dynamic = 0;
+
static int editor_hl_empty[] = { };
static int editor_el_empty[ED_NUM_ELEMENTLIST_BUTTONS];
&editor_hl_custom_ptr, &num_editor_hl_custom,
&editor_el_custom_ptr, &num_editor_el_custom
},
- {
- &setup.editor.el_custom_more,
- &editor_hl_custom_more_ptr, &num_editor_hl_custom_more,
- &editor_el_custom_more_ptr, &num_editor_el_custom_more
- },
- {
- &setup.editor.el_custom,
- &editor_hl_custom_special_ptr, &num_editor_hl_custom_special,
- &editor_el_custom_special_ptr, &num_editor_el_custom_special
- },
{
&setup.editor.el_custom,
&editor_hl_group_ptr, &num_editor_hl_group,
&editor_el_group_ptr, &num_editor_el_group
},
- {
- &setup.editor.el_custom_more,
- &editor_hl_group_more_ptr, &num_editor_hl_group_more,
- &editor_el_group_more_ptr, &num_editor_el_group_more
- },
{
&setup.editor.el_user_defined,
&editor_hl_user_defined_ptr, &num_editor_hl_user_defined,
&editor_el_user_defined_ptr, &num_editor_el_user_defined
},
+ {
+ &setup.editor.el_dynamic,
+ &editor_hl_dynamic_ptr, &num_editor_hl_dynamic,
+ &editor_el_dynamic_ptr, &num_editor_el_dynamic,
+ },
{
&use_el_empty,
&editor_hl_empty_ptr, &num_editor_hl_empty,
{
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;
return info_text;
}
+static void InitDynamicEditorElementList(int **elements, int *num_elements)
+{
+ boolean element_found[NUM_FILE_ELEMENTS];
+ int i, x, y;
+
+ /* initialize list of used elements to "not used" */
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ element_found[i] = FALSE;
+
+ /* find all elements used in current level */
+ for (y = 0; y < lev_fieldy; y++)
+ for (x = 0; x < lev_fieldx; x++)
+ if (Feld[x][y] < NUM_FILE_ELEMENTS) /* should always be true */
+ element_found[Feld[x][y]] = TRUE;
+
+ *num_elements = 0;
+
+ /* count number of elements used in current level */
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ if (element_found[i])
+ (*num_elements)++;
+
+ /* add space for up to 3 more elements for padding that may be needed */
+ *num_elements += 3;
+
+ /* free memory for old list of elements, if needed */
+ checked_free(*elements);
+
+ /* allocate memory for new list of elements */
+ *elements = checked_malloc(*num_elements * sizeof(int));
+
+ *num_elements = 0;
+
+ /* add all elements used in current level (non-custom/group elements) */
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ if (element_found[i] && !(IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)))
+ (*elements)[(*num_elements)++] = i;
+
+ /* add all elements used in current level (custom/group elements) */
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ if (element_found[i] && (IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)))
+ (*elements)[(*num_elements)++] = i;
+
+ while (*num_elements % 4) /* pad with empty elements, if needed */
+ (*elements)[(*num_elements)++] = EL_EMPTY;
+}
+
static void ReinitializeElementList()
{
int pos = 0;
LoadUserDefinedEditorElementList(&editor_el_user_defined_ptr,
&num_editor_el_user_defined);
+ /* initialize dynamic level element list for each invocation of editor */
+ InitDynamicEditorElementList(&editor_el_dynamic_ptr,
+ &num_editor_el_dynamic);
+
/* initialize list of empty elements (used for padding, if needed) */
for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++)
editor_el_empty[i] = EL_EMPTY;
/* determine size of element list */
for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
{
+ boolean found_inactive_cascade = FALSE;
+
if (*editor_elements_info[i].setup_value)
{
if (setup.editor.el_headlines)
+ {
num_editor_elements += *editor_elements_info[i].headline_list_size;
+ for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
+ {
+ int element = (*editor_elements_info[i].headline_list)[j];
+
+ if (IS_EDITOR_CASCADE_INACTIVE(element))
+ found_inactive_cascade = TRUE;
+ }
+ }
+
+ if (found_inactive_cascade)
+ continue;
+
num_editor_elements += *editor_elements_info[i].element_list_size;
}
}
/* fill element list */
for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
{
+ boolean found_inactive_cascade = FALSE;
+
if (*editor_elements_info[i].setup_value)
{
if (setup.editor.el_headlines)
+ {
for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
- editor_elements[pos++] = (*editor_elements_info[i].headline_list)[j];
+ {
+ int element = (*editor_elements_info[i].headline_list)[j];
+
+ editor_elements[pos++] = element;
+
+ if (IS_EDITOR_CASCADE_INACTIVE(element))
+ found_inactive_cascade = TRUE;
+ }
+ }
+
+ if (found_inactive_cascade)
+ continue;
for (j = 0; j < *editor_elements_info[i].element_list_size; j++)
editor_elements[pos++] = (*editor_elements_info[i].element_list)[j];
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 ||
- Feld[x][y] == EL_SP_MURPHY)
- player_found = TRUE;
+ for (y = 0; y < lev_fieldy; y++) for (x = 0; x < lev_fieldx; x++)
+ {
+ if (Feld[x][y] == EL_PLAYER_1 ||
+ Feld[x][y] == EL_SP_MURPHY)
+ player_found = TRUE;
+ }
return player_found;
}
redraw_mask |= REDRAW_ALL;
+ ReinitializeElementList(); /* update dynamic level element list */
ReinitializeElementListButtons(); /* custom element may look different */
UnmapTapeButtons();
GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
}
+static void AdjustElementListScrollbar()
+{
+ struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL];
+ int items_max, items_visible, item_position;
+
+ if (element_shift < 0)
+ element_shift = 0;
+ if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
+ element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
+
+ items_max = num_editor_elements / ED_ELEMENTLIST_BUTTONS_HORIZ;
+ items_visible = ED_ELEMENTLIST_BUTTONS_VERT;
+ item_position = element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ;
+
+ ModifyGadget(gi, GDI_SCROLLBAR_ITEMS_MAX, items_max,
+ GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
+ GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
+}
+
static void ModifyEditorCounterValue(int counter_id, int new_value)
{
int *counter_value = counterbutton_info[counter_id].value;
ClearWindow();
UnmapLevelEditorWindowGadgets();
+#if 0
+ DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Level Settings");
+ DrawTextSCentered(ED_SETTINGS2_YPOS, FONT_TITLE_1, "Editor Settings");
+#else
DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
"Level Settings", FONT_TITLE_1);
DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS,
"Editor Settings", FONT_TITLE_1);
+#endif
/* draw counter gadgets */
for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++)
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
DrawElementBorder(SX + xstart * MINI_TILEX,
SY + ystart * MINI_TILEY + MINI_TILEY / 2,
int element_position = id - GADGET_ID_ELEMENTLIST_FIRST;
int new_element = editor_elements[element_position + element_shift];
+ if (IS_EDITOR_CASCADE(new_element))
+ {
+ int i;
+
+ for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
+ {
+ int *cascade_element = *editor_elements_info[i].headline_list;
+
+ if (*cascade_element == new_element)
+ {
+ *cascade_element = EL_CASCADE_TOGGLE(*cascade_element);
+
+ ReinitializeElementList();
+#if 0
+ ReinitializeElementListButtons();
+#endif
+ ModifyEditorElementList();
+ AdjustElementListScrollbar();
+
+ PrintEditorGadgetInfoText(level_editor_gadget[id]);
+
+ break;
+ }
+ }
+
+ break;
+ }
+
if (last_custom_copy_mode != -1)
{
if (CopyCustomElement(properties_element, new_element,
DrawBackground(INFOTEXT_XPOS, INFOTEXT_YPOS, INFOTEXT_XSIZE, INFOTEXT_YSIZE);
}
+void PrintEditorGadgetInfoText(struct GadgetInfo *gi)
+{
+ char infotext[MAX_OUTPUT_LINESIZE + 1];
+ char shortcut[MAX_OUTPUT_LINESIZE + 1];
+ int max_infotext_len = getMaxInfoTextLength();
+
+ 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);
+}
+
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;
ClearEditorGadgetInfoText();
- if (gi->event.type == GD_EVENT_INFO_LEAVING)
+ if (gi == NULL || gi->event.type == GD_EVENT_INFO_LEAVING)
return;
/* misuse this function to delete brush cursor, if needed */
if (edit_mode == ED_MODE_DRAWING && draw_with_brush)
DeleteBrushFromCursor();
+#if 1
+ PrintEditorGadgetInfoText(gi);
+#else
if (gi == NULL || gi->info_text == NULL)
return;
}
DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FONT_TEXT_2);
+#endif
}
static void HandleDrawingAreaInfo(struct GadgetInfo *gi)