X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=ee201420d2029dd184f33028da5db76702b1e0e0;hb=78ec772d11cb8823d8dca05c227b472da8708a07;hp=9df186776b76713a89461b6aa0dcbd0f685b12b6;hpb=72b2940bea34cebf61175bc62a474cb78dcec467;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 9df18677..ee201420 100644 --- a/src/editor.c +++ b/src/editor.c @@ -51,10 +51,6 @@ #define MIN_SCORE 0 #define MAX_SCORE 255 -/* values for elements with content */ -#define MIN_ELEM_CONTENT 1 -#define MAX_ELEM_CONTENT 8 - /* values for the control window */ #define ED_CTRL_BUTTONS_GFX_YPOS 236 #define ED_CTRL_BUTTONS_ALT_GFX_YPOS 142 @@ -380,15 +376,15 @@ static struct { 'E', "exit level editor" } }; -/* pointers to counter values */ -static int *gadget_elem_score_value = NULL; -static int *gadget_elem_content_value = NULL; -static int *gadget_level_xsize_value = NULL; -static int *gadget_level_ysize_value = NULL; -static int *gadget_level_random_value = NULL; -static int *gadget_level_collect_value = NULL; -static int *gadget_level_timelimit_value = NULL; -static int *gadget_level_timescore_value = NULL; +/* values for random placement */ +#define RANDOM_USE_PERCENTAGE 0 +#define RANDOM_USE_QUANTITY 1 + +static int random_placement_value = 10; +static int random_placement_method = RANDOM_USE_QUANTITY; +static int random_placement_background_element = EL_ERDREICH; +static boolean random_placement_background_restricted = FALSE; +static boolean stick_element_properties_window = FALSE; static struct { @@ -396,7 +392,7 @@ static struct int min_value, max_value; int gadget_id_down, gadget_id_up; int gadget_id_text; - int **counter_value; + int *value; char *infotext_above, *infotext_right; } counterbutton_info[ED_NUM_COUNTERBUTTONS] = { @@ -405,15 +401,15 @@ static struct MIN_SCORE, MAX_SCORE, GADGET_ID_ELEM_SCORE_DOWN, GADGET_ID_ELEM_SCORE_UP, GADGET_ID_ELEM_SCORE_TEXT, - &gadget_elem_score_value, + NULL, /* will be set when used */ "element score", NULL }, { ED_COUNT_ELEM_CONTENT_XPOS, ED_COUNT_ELEM_CONTENT_YPOS, - MIN_ELEM_CONTENT, MAX_ELEM_CONTENT, + MIN_ELEMENT_CONTENTS, MAX_ELEMENT_CONTENTS, GADGET_ID_ELEM_CONTENT_DOWN, GADGET_ID_ELEM_CONTENT_UP, GADGET_ID_ELEM_CONTENT_TEXT, - &gadget_elem_content_value, + &level.num_yam_contents, "element content", NULL }, { @@ -421,7 +417,7 @@ static struct MIN_LEV_FIELDX, MAX_LEV_FIELDX, GADGET_ID_LEVEL_XSIZE_DOWN, GADGET_ID_LEVEL_XSIZE_UP, GADGET_ID_LEVEL_XSIZE_TEXT, - &gadget_level_xsize_value, + &level.fieldx, "playfield size", "width", }, { @@ -429,7 +425,7 @@ static struct MIN_LEV_FIELDY, MAX_LEV_FIELDY, GADGET_ID_LEVEL_YSIZE_DOWN, GADGET_ID_LEVEL_YSIZE_UP, GADGET_ID_LEVEL_YSIZE_TEXT, - &gadget_level_ysize_value, + &level.fieldy, NULL, "height", }, { @@ -437,7 +433,7 @@ static struct 0, 999, GADGET_ID_LEVEL_COLLECT_DOWN, GADGET_ID_LEVEL_COLLECT_UP, GADGET_ID_LEVEL_COLLECT_TEXT, - &gadget_level_collect_value, + &level.gems_needed, "number of emeralds to collect", NULL }, { @@ -445,7 +441,7 @@ static struct 0, 999, GADGET_ID_LEVEL_TIMELIMIT_DOWN, GADGET_ID_LEVEL_TIMELIMIT_UP, GADGET_ID_LEVEL_TIMELIMIT_TEXT, - &gadget_level_timelimit_value, + &level.time, "time available to solve level", "(0 => no time limit)" }, { @@ -453,7 +449,7 @@ static struct 0, 255, GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP, GADGET_ID_LEVEL_TIMESCORE_TEXT, - &gadget_level_timescore_value, + &level.score[SC_ZEITBONUS], "score for each 10 seconds left", NULL }, { @@ -461,7 +457,7 @@ static struct 1, 100, GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP, GADGET_ID_LEVEL_RANDOM_TEXT, - &gadget_level_random_value, + &random_placement_value, "random element placement", "in" } }; @@ -565,16 +561,6 @@ static struct } }; -/* values for random placement */ -#define RANDOM_USE_PERCENTAGE 0 -#define RANDOM_USE_QUANTITY 1 - -static int random_placement_value = 10; -static int random_placement_method = RANDOM_USE_QUANTITY; -static int random_placement_background_element = EL_ERDREICH; -static boolean random_placement_background_restricted = FALSE; -static boolean stick_element_properties_window = FALSE; - static struct { int x, y; @@ -655,17 +641,20 @@ static int new_element3 = EL_ERDREICH; #define BUTTON_ELEMENT(button) (button == 1 ? new_element1 : \ button == 2 ? new_element2 : \ button == 3 ? new_element3 : EL_LEERRAUM) +#define BUTTON_STEPSIZE(button) (button == 1 ? 1 : button == 2 ? 5 : 10) /* forward declaration for internal use */ static void DrawDrawingWindow(); static void DrawLevelInfoWindow(); static void DrawPropertiesWindow(); static void CopyLevelToUndoBuffer(int); -static void HandleControlButtons(struct GadgetInfo *); -static void HandleCounterButtons(struct GadgetInfo *); static void HandleDrawingAreas(struct GadgetInfo *); -static void HandleDrawingAreaInfo(struct GadgetInfo *); +static void HandleCounterButtons(struct GadgetInfo *); static void HandleTextInputGadgets(struct GadgetInfo *); +static void HandleRadiobuttons(struct GadgetInfo *); +static void HandleCheckbuttons(struct GadgetInfo *); +static void HandleControlButtons(struct GadgetInfo *); +static void HandleDrawingAreaInfo(struct GadgetInfo *); static struct GadgetInfo *level_editor_gadget[NUM_EDITOR_GADGETS]; @@ -674,7 +663,7 @@ static int last_drawing_function = GADGET_ID_SINGLE_ITEMS; static boolean draw_with_brush = FALSE; static int properties_element = 0; -static short ElementContent[MAX_ELEM_CONTENT][3][3]; +static short ElementContent[MAX_ELEMENT_CONTENTS][3][3]; static short FieldBackup[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; static short UndoBuffer[NUM_UNDO_STEPS][MAX_LEV_FIELDX][MAX_LEV_FIELDY]; static int undo_buffer_position = 0; @@ -1178,6 +1167,7 @@ static void CreateControlButtons() gd_y2 = DOOR_GFX_PAGEY1 + ED_CTRL_BUTTONS_ALT_GFX_YPOS + gd_yoffset; gi = CreateGadget(GDI_CUSTOM_ID, id, + GDI_CUSTOM_TYPE_ID, i, GDI_INFO_TEXT, control_info[i].text, GDI_X, EX + gd_xoffset, GDI_Y, EY + gd_yoffset, @@ -1235,9 +1225,10 @@ static void CreateControlButtons() gd_y1 = DOOR_GFX_PAGEY1 + scrollbutton_info[i].ypos; gd_x2 = gd_x1 - ED_SCROLLBUTTON_XSIZE; gd_y2 = gd_y1; - } + } gi = CreateGadget(GDI_CUSTOM_ID, id, + GDI_CUSTOM_TYPE_ID, i, GDI_INFO_TEXT, scrollbutton_info[i].infotext, GDI_X, x, GDI_Y, y, @@ -1283,6 +1274,7 @@ static void CreateControlButtons() deco_ypos = (ED_ELEMENTLIST_YSIZE - MINI_TILEY) / 2; gi = CreateGadget(GDI_CUSTOM_ID, id, + GDI_CUSTOM_TYPE_ID, i, GDI_INFO_TEXT, element_info[editor_element[i]], GDI_X, DX + gd_xoffset, GDI_Y, DY + gd_yoffset, @@ -1340,6 +1332,7 @@ static void CreateCounterButtons() (j == 0 ? "decrease" : "increase")); gi = CreateGadget(GDI_CUSTOM_ID, id, + GDI_CUSTOM_TYPE_ID, i, GDI_INFO_TEXT, infotext, GDI_X, xpos, GDI_Y, ypos, @@ -1368,6 +1361,7 @@ static void CreateCounterButtons() gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS; gi = CreateGadget(GDI_CUSTOM_ID, id, + GDI_CUSTOM_TYPE_ID, i, GDI_INFO_TEXT, "enter counter value", GDI_X, xpos, GDI_Y, ypos, @@ -1423,13 +1417,14 @@ static void CreateDrawingAreas() level_editor_gadget[id] = gi; /* ... up to eight areas for element content ... */ - for (i=0; i= GADGET_ID_ELEM_CONTENT_0 && id <= GADGET_ID_ELEM_CONTENT_7) - level.mampfer_inhalt[id - GADGET_ID_ELEM_CONTENT_0][sx][sy] = + level.yam_content[id - GADGET_ID_ELEM_CONTENT_0][sx][sy] = new_element; } break; @@ -3289,127 +3281,47 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) static void HandleCounterButtons(struct GadgetInfo *gi) { - int id = gi->custom_id; + int gadget_id = gi->custom_id; + int counter_id = gi->custom_type_id; int button = gi->event.button; - int step = (button == 1 ? 1 : button == 2 ? 5 : 10); - - switch (id) - { - case GADGET_ID_ELEM_SCORE_DOWN: - case GADGET_ID_ELEM_SCORE_UP: - step *= (id == GADGET_ID_ELEM_SCORE_DOWN ? -1 : 1); - ModifyEditorCounter(ED_COUNTER_ID_ELEM_SCORE, - *gadget_elem_score_value + step); - break; - case GADGET_ID_ELEM_SCORE_TEXT: - *gadget_elem_score_value = gi->text.number_value; - break; - - case GADGET_ID_ELEM_CONTENT_DOWN: - case GADGET_ID_ELEM_CONTENT_UP: - step *= (id == GADGET_ID_ELEM_CONTENT_DOWN ? -1 : 1); - ModifyEditorCounter(ED_COUNTER_ID_ELEM_CONTENT, - *gadget_elem_content_value + step); - DrawElementContentAreas(); - break; - case GADGET_ID_ELEM_CONTENT_TEXT: - *gadget_elem_content_value = gi->text.number_value; - DrawElementContentAreas(); - break; - - case GADGET_ID_LEVEL_XSIZE_DOWN: - case GADGET_ID_LEVEL_XSIZE_UP: - step *= (id == GADGET_ID_LEVEL_XSIZE_DOWN ? -1 : 1); - ModifyEditorCounter(ED_COUNTER_ID_LEVEL_XSIZE, - *gadget_level_xsize_value + step); - level.fieldx = lev_fieldx; - break; - case GADGET_ID_LEVEL_XSIZE_TEXT: - *gadget_level_xsize_value = gi->text.number_value; - level.fieldx = lev_fieldx; - break; - - case GADGET_ID_LEVEL_YSIZE_DOWN: - case GADGET_ID_LEVEL_YSIZE_UP: - step *= (id == GADGET_ID_LEVEL_YSIZE_DOWN ? -1 : 1); - ModifyEditorCounter(ED_COUNTER_ID_LEVEL_YSIZE, - *gadget_level_ysize_value + step); - level.fieldy = lev_fieldy; - break; - case GADGET_ID_LEVEL_YSIZE_TEXT: - *gadget_level_ysize_value = gi->text.number_value; - level.fieldy = lev_fieldy; - break; - - case GADGET_ID_LEVEL_RANDOM_DOWN: - case GADGET_ID_LEVEL_RANDOM_UP: - step *= (id == GADGET_ID_LEVEL_RANDOM_DOWN ? -1 : 1); - ModifyEditorCounter(ED_COUNTER_ID_LEVEL_RANDOM, - *gadget_level_random_value + step); - break; - case GADGET_ID_LEVEL_RANDOM_TEXT: - *gadget_level_random_value = gi->text.number_value; - break; - - case GADGET_ID_LEVEL_COLLECT_DOWN: - case GADGET_ID_LEVEL_COLLECT_UP: - step *= (id == GADGET_ID_LEVEL_COLLECT_DOWN ? -1 : 1); - ModifyEditorCounter(ED_COUNTER_ID_LEVEL_COLLECT, - *gadget_level_collect_value + step); - break; - case GADGET_ID_LEVEL_COLLECT_TEXT: - *gadget_level_collect_value = gi->text.number_value; - break; - - case GADGET_ID_LEVEL_TIMELIMIT_DOWN: - case GADGET_ID_LEVEL_TIMELIMIT_UP: - step *= (id == GADGET_ID_LEVEL_TIMELIMIT_DOWN ? -1 : 1); - ModifyEditorCounter(ED_COUNTER_ID_LEVEL_TIMELIMIT, - *gadget_level_timelimit_value + step); - break; - case GADGET_ID_LEVEL_TIMELIMIT_TEXT: - *gadget_level_timelimit_value = gi->text.number_value; - break; - - case GADGET_ID_LEVEL_TIMESCORE_DOWN: - case GADGET_ID_LEVEL_TIMESCORE_UP: - step *= (id == GADGET_ID_LEVEL_TIMESCORE_DOWN ? -1 : 1); - ModifyEditorCounter(ED_COUNTER_ID_LEVEL_TIMESCORE, - *gadget_level_timescore_value + step); - break; - case GADGET_ID_LEVEL_TIMESCORE_TEXT: - *gadget_level_timescore_value = gi->text.number_value; - break; + int *counter_value = counterbutton_info[counter_id].value; + int step = BUTTON_STEPSIZE(button) * + (gadget_id == counterbutton_info[counter_id].gadget_id_down ? -1 : +1); - default: - break; - } + if (gadget_id == counterbutton_info[counter_id].gadget_id_text) + *counter_value = gi->text.number_value; + else + ModifyEditorCounter(counter_id, *counter_value + step); + + if (counter_id == ED_COUNTER_ID_ELEM_CONTENT) + DrawElementContentAreas(); + else if (counter_id == ED_COUNTER_ID_LEVEL_XSIZE) + lev_fieldx = level.fieldx; + else if (counter_id == ED_COUNTER_ID_LEVEL_YSIZE) + lev_fieldy = level.fieldy; } static void HandleTextInputGadgets(struct GadgetInfo *gi) { - int id = gi->custom_id; - - switch (id) - { - case GADGET_ID_LEVEL_NAME: - strcpy(level.name, gi->text.value); - break; + strcpy(textinput_info[gi->custom_type_id].value, gi->text.value); +} - case GADGET_ID_LEVEL_AUTHOR: - strcpy(level.author, gi->text.value); - break; +static void HandleRadiobuttons(struct GadgetInfo *gi) +{ + *radiobutton_info[gi->custom_type_id].value = + radiobutton_info[gi->custom_type_id].checked_value; +} - default: - break; - } +static void HandleCheckbuttons(struct GadgetInfo *gi) +{ + *checkbutton_info[gi->custom_type_id].value ^= TRUE; } static void HandleControlButtons(struct GadgetInfo *gi) { int id = gi->custom_id; int button = gi->event.button; - int step = (button == 1 ? 1 : button == 2 ? 5 : 10); + int step = BUTTON_STEPSIZE(button); int new_element = BUTTON_ELEMENT(button); int player_present = FALSE; int level_changed = FALSE; @@ -3745,32 +3657,6 @@ static void HandleControlButtons(struct GadgetInfo *gi) } break; - case GADGET_ID_RANDOM_PERCENTAGE: - *radiobutton_info[ED_RADIOBUTTON_ID_PERCENTAGE].value = - radiobutton_info[ED_RADIOBUTTON_ID_PERCENTAGE].checked_value; - break; - - case GADGET_ID_RANDOM_QUANTITY: - *radiobutton_info[ED_RADIOBUTTON_ID_QUANTITY].value = - radiobutton_info[ED_RADIOBUTTON_ID_QUANTITY].checked_value; - break; - - case GADGET_ID_RANDOM_RESTRICTED: - *checkbutton_info[ED_CHECKBUTTON_ID_RANDOM_RESTRICTED].value ^= TRUE; - break; - - case GADGET_ID_DOUBLE_SPEED: - *checkbutton_info[ED_CHECKBUTTON_ID_DOUBLE_SPEED].value ^= TRUE; - break; - - case GADGET_ID_GRAVITY: - *checkbutton_info[ED_CHECKBUTTON_ID_GRAVITY].value ^= TRUE; - break; - - case GADGET_ID_STICK_ELEMENT: - *checkbutton_info[ED_CHECKBUTTON_ID_STICK_ELEMENT].value ^= TRUE; - break; - default: if (id >= GADGET_ID_ELEMENTLIST_FIRST && id <= GADGET_ID_ELEMENTLIST_LAST)