X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=1e45e10641304a26a353278d04b6aea85f7d1dd9;hb=ad15815ec04f42779d0717a6d291f93b8e847d39;hp=636e21dc3297ee15e67979aba4072c06a2c8f9d3;hpb=86b0ea5594dc5a9db7ac5d71fa2b7487a4fc1f9d;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 636e21dc..1e45e106 100644 --- a/src/editor.c +++ b/src/editor.c @@ -24,6 +24,9 @@ #include "tape.h" +#define INFOTEXT_UNKNOWN_ELEMENT "unknown" + + /* ----------------------------------------------------------------------------- screen and artwork graphic pixel position definitions @@ -127,7 +130,7 @@ #define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(12) + \ ED_GADGET_DISTANCE - MINI_TILEY) /* custom change trigger element */ -#define ED_AREA_ELEM_CONTENT5_YPOS (ED_SETTINGS_YPOS(7) + \ +#define ED_AREA_ELEM_CONTENT5_YPOS (ED_SETTINGS_YPOS(6) + \ ED_GADGET_DISTANCE) /* extended custom change target */ #define ED_AREA_ELEM_CONTENT6_XPOS (29 * MINI_TILEX) @@ -397,9 +400,9 @@ #define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 8) #define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 9) #define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 10) -#define GADGET_ID_CHANGE_PLAYER_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) -#define GADGET_ID_CHANGE_COLLIDE_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) -#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 13) +#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) +#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_CHANGE_SIDES (GADGET_ID_SELECTBOX_FIRST + 13) #define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 14) #define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 15) @@ -465,12 +468,11 @@ #define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 23) #define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 24) #define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 25) -#define GADGET_ID_CHANGE_BY_PLAYER (GADGET_ID_CHECKBUTTON_FIRST + 26) -#define GADGET_ID_CHANGE_BY_COLLISION (GADGET_ID_CHECKBUTTON_FIRST + 27) -#define GADGET_ID_CHANGE_BY_OTHER (GADGET_ID_CHECKBUTTON_FIRST + 28) +#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 27) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 29) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 28) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -567,9 +569,9 @@ #define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 8 #define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 9 #define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 10 -#define ED_SELECTBOX_ID_CHANGE_PLAYER_ACTION 11 -#define ED_SELECTBOX_ID_CHANGE_COLLIDE_ACTION 12 -#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 13 +#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 11 +#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 12 +#define ED_SELECTBOX_ID_CHANGE_SIDES 13 #define ED_SELECTBOX_ID_CHANGE_POWER 14 #define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 15 @@ -626,16 +628,15 @@ #define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 16 #define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 17 #define ED_CHECKBUTTON_ID_CHANGE_DELAY 18 -#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER 19 -#define ED_CHECKBUTTON_ID_CHANGE_BY_COLLISION 20 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER 21 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 22 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 23 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 24 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 25 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 26 +#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 19 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 20 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 21 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 22 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 23 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 24 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 25 -#define ED_NUM_CHECKBUTTONS 27 +#define ED_NUM_CHECKBUTTONS 26 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED @@ -862,7 +863,7 @@ static struct MIN_ENVELOPE_XSIZE, MAX_ENVELOPE_XSIZE, GADGET_ID_ENVELOPE_XSIZE_DOWN, GADGET_ID_ENVELOPE_XSIZE_UP, GADGET_ID_ENVELOPE_XSIZE_TEXT, GADGET_ID_NONE, - &level.envelope_xsize, + NULL, NULL, NULL, "width", }, { @@ -870,7 +871,7 @@ static struct MIN_ENVELOPE_YSIZE, MAX_ENVELOPE_YSIZE, GADGET_ID_ENVELOPE_YSIZE_DOWN, GADGET_ID_ENVELOPE_YSIZE_UP, GADGET_ID_ENVELOPE_YSIZE_TEXT, GADGET_ID_ENVELOPE_XSIZE_UP, - &level.envelope_ysize, + NULL, NULL, " ", "height", }, @@ -949,7 +950,7 @@ static struct GADGET_ID_CHANGE_CONT_RND_DOWN, GADGET_ID_CHANGE_CONT_RND_UP, GADGET_ID_CHANGE_CONT_RND_TEXT, GADGET_ID_NONE, &custom_element_change.random, - NULL, "use random change:", "(%)" + NULL, "use random replace:", "%" }, }; @@ -998,7 +999,7 @@ static struct ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2), GADGET_ID_ENVELOPE_INFO, MAX_ENVELOPE_XSIZE, MAX_ENVELOPE_YSIZE, - level.envelope, + NULL, "Envelope Info:", "Envelope Info" } }; @@ -1042,6 +1043,7 @@ static struct ValueTextInfo options_move_pattern[] = { MV_ALONG_RIGHT_SIDE, "along right side" }, { MV_TURNING_LEFT, "turning left" }, { MV_TURNING_RIGHT, "turning right" }, + { MV_WHEN_PUSHED, "when pushed" }, { -1, NULL } }; @@ -1103,46 +1105,60 @@ static struct ValueTextInfo options_consistency[] = static struct ValueTextInfo options_time_units[] = { - { FRAMES_PER_SECOND, "seconds" }, { 1, "frames" }, + { FRAMES_PER_SECOND, "seconds" }, { -1, NULL } }; -static struct ValueTextInfo options_change_player_action[] = -{ - { CE_TOUCHED_BY_PLAYER, "touched" }, - { CE_PRESSED_BY_PLAYER, "pressed" }, - { CE_PUSHED_BY_PLAYER, "pushed" }, - { CE_DROPPED_BY_PLAYER, "dropped" }, +static struct ValueTextInfo options_change_direct_action[] = +{ + { CE_TOUCHED_BY_PLAYER, "touched by player ..." }, + { CE_PRESSED_BY_PLAYER, "pressed by player ..." }, + { CE_PUSHED_BY_PLAYER, "pushed by player ..." }, + { CE_ENTERED_BY_PLAYER, "entered by player ..." }, + { 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" }, { -1, NULL } }; -static struct ValueTextInfo options_change_collide_action[] = +static struct ValueTextInfo options_change_other_action[] = { - { CE_COLLISION, "on collision" }, - { CE_IMPACT, "on impact" }, - { CE_SMASHED, "when smashed" }, + { CE_OTHER_GETS_TOUCHED, "player touches ..." }, + { CE_OTHER_GETS_PRESSED, "player presses ..." }, + { CE_OTHER_GETS_PUSHED, "player pushes ..." }, + { CE_OTHER_GETS_ENTERED, "player enters ..." }, + { CE_OTHER_GETS_LEFT, "player leaves ..." }, + { CE_OTHER_GETS_DIGGED, "player digs" }, + { CE_OTHER_GETS_COLLECTED, "player collects" }, + { CE_OTHER_GETS_DROPPED, "player drops" }, + { CE_OTHER_IS_TOUCHING, "touching ..." }, + { CE_OTHER_IS_SWITCHING, "switch of ..." }, + { CE_OTHER_IS_CHANGING, "change of" }, + { CE_OTHER_IS_EXPLODING, "explosion of" }, { -1, NULL } }; -static struct ValueTextInfo options_change_other_action[] = +static struct ValueTextInfo options_change_sides[] = { - { CE_OTHER_IS_TOUCHING, "touching" }, - { CE_OTHER_IS_CHANGING, "change of" }, - { CE_OTHER_IS_EXPLODING, "explosion of" }, - { CE_OTHER_GETS_TOUCHED, "player touches" }, - { CE_OTHER_GETS_PRESSED, "player presses" }, - { CE_OTHER_GETS_PUSHED, "player pushes" }, - { CE_OTHER_GETS_COLLECTED, "player collects" }, - { CE_OTHER_GETS_DROPPED, "player drops" }, + { CH_SIDE_LEFT, "left side" }, + { CH_SIDE_RIGHT, "right side" }, + { CH_SIDE_TOP, "top side" }, + { CH_SIDE_BOTTOM, "bottom side" }, + { CH_SIDE_LEFT_RIGHT, "left/right side" }, + { CH_SIDE_TOP_BOTTOM, "top/bottom side" }, + { CH_SIDE_ANY, "all sides" }, { -1, NULL } }; static struct ValueTextInfo options_change_power[] = { - { CP_NON_DESTRUCTIVE, "non-destructive" }, - { CP_HALF_DESTRUCTIVE, "half-destructive" }, - { CP_FULL_DESTRUCTIVE, "full-destructive" }, + { CP_NON_DESTRUCTIVE, "empty" }, + { CP_HALF_DESTRUCTIVE, "diggable" }, + { CP_FULL_DESTRUCTIVE, "destructible" }, { -1, NULL } }; @@ -1171,7 +1187,7 @@ static struct -1, options_access_type, &custom_element.access_type, - "player can", NULL, "type of access to this field" + "player can", NULL, "type of access to this field" }, { -1, ED_SETTINGS_YPOS(1), @@ -1179,7 +1195,7 @@ static struct -1, options_access_layer, &custom_element.access_layer, - NULL, NULL, "layer of access for this field" + NULL, NULL, "layer of access for this field" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(2), @@ -1187,7 +1203,7 @@ static struct -1, options_walk_to_action, &custom_element.walk_to_action, - NULL, NULL, "diggable/collectible/pushable" + NULL, NULL, "diggable/collectible/pushable" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5), @@ -1195,7 +1211,7 @@ static struct -1, options_move_pattern, &custom_element.move_pattern, - "can move", NULL, "element move direction" + "can move", NULL, "element move direction" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), @@ -1203,7 +1219,7 @@ static struct -1, options_move_direction, &custom_element.move_direction_initial, - "starts moving", NULL, "initial element move direction" + "starts moving", NULL, "initial element move direction" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), @@ -1211,7 +1227,7 @@ static struct -1, options_move_stepsize, &custom_element.move_stepsize, - "move/fall speed", NULL, "speed of element movement" + "move/fall speed", NULL, "speed of element movement" }, { -1, ED_SETTINGS_YPOS(9), @@ -1219,7 +1235,7 @@ static struct -1, options_smash_targets, &custom_element.smash_targets, - "can smash", NULL, "elements that can be smashed" + "can smash", NULL, "elements that can be smashed" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10), @@ -1227,7 +1243,7 @@ static struct -1, options_slippery_type, &custom_element.slippery_type, - "slippery", NULL, "where other elements fall down" + "slippery", NULL, "where other elements fall down" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), @@ -1235,7 +1251,7 @@ static struct -1, options_deadliness, &custom_element.deadliness, - "deadly when", NULL, "deadliness of element" + "deadly when", NULL, "deadliness of element" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12), @@ -1243,7 +1259,7 @@ static struct -1, options_consistency, &custom_element.consistency, - NULL, NULL, "consistency/destructibility" + NULL, NULL, "consistency/destructibility" }, /* ---------- element settings: advanced (custom elements) --------------- */ @@ -1254,31 +1270,31 @@ static struct -1, options_time_units, &custom_element_change.delay_frames, - "delay time given in", NULL, "delay time units for change" + "delay time given in", NULL, "delay time units for change" }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(5), - GADGET_ID_CHANGE_PLAYER_ACTION, GADGET_ID_NONE, + GADGET_ID_CHANGE_DIRECT_ACTION, GADGET_ID_NONE, -1, - options_change_player_action, - &custom_element_change.player_action, - NULL, "by player", "type of player contact" + options_change_direct_action, + &custom_element_change.direct_action, + NULL, NULL, "type of direct action" }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(6), - GADGET_ID_CHANGE_COLLIDE_ACTION, GADGET_ID_NONE, + GADGET_ID_CHANGE_OTHER_ACTION, GADGET_ID_NONE, -1, - options_change_collide_action, - &custom_element_change.collide_action, - NULL, NULL, "change after impact or smash" + options_change_other_action, + &custom_element_change.other_action, + NULL, "element:", "type of other element action" }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(7), - GADGET_ID_CHANGE_OTHER_ACTION, GADGET_ID_NONE, + GADGET_ID_CHANGE_SIDES, GADGET_ID_NONE, -1, - options_change_other_action, - &custom_element_change.other_action, - NULL, "element:", "type of other element action" + options_change_sides, + &custom_element_change.sides, + "... at", NULL, "element side that causes change" }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(10), @@ -1286,7 +1302,7 @@ static struct -1, options_change_power, &custom_element_change.power, - "power:", NULL, "power of extended change" + "replace when", NULL, "which elements can be replaced" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(14), @@ -1294,7 +1310,7 @@ static struct 3, options_change_page, &custom_element.current_change_page, - NULL, NULL, "element config page" + NULL, NULL, "element config page" }, }; @@ -1501,7 +1517,7 @@ static struct { -1, ED_COUNTER_YPOS(6) - MINI_TILEY, GADGET_ID_GRAVITY, GADGET_ID_DOUBLE_SPEED, - &level.gravity, + &level.initial_gravity, " ", "gravity", "set level gravity" }, { @@ -1620,20 +1636,14 @@ static struct }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5), - GADGET_ID_CHANGE_BY_PLAYER, GADGET_ID_NONE, - &custom_element_change_events[CE_BY_PLAYER], - NULL, NULL, "element changes by player contact" + GADGET_ID_CHANGE_BY_DIRECT_ACT, GADGET_ID_NONE, + &custom_element_change_events[CE_BY_DIRECT_ACTION], + NULL, NULL, "element changes by direct action" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), - GADGET_ID_CHANGE_BY_COLLISION, GADGET_ID_NONE, - &custom_element_change_events[CE_BY_COLLISION], - NULL, NULL, "element changes by impact or smash" - }, - { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), - GADGET_ID_CHANGE_BY_OTHER, GADGET_ID_NONE, - &custom_element_change_events[CE_BY_OTHER], + GADGET_ID_CHANGE_BY_OTHER_ACT, GADGET_ID_NONE, + &custom_element_change_events[CE_BY_OTHER_ACTION], NULL, NULL, "element changes by other element" }, { @@ -1652,13 +1662,13 @@ static struct ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(11), GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE, &custom_element_change.only_complete, - NULL, "only use complete change", "only use complete extended content" + NULL, "replace all or nothing", "only replace when all can be changed" }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(12), GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE, &custom_element_change.use_random_change, - NULL, NULL, "use random value for new content" + NULL, NULL, "use percentage for random replace" }, { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13), @@ -1995,10 +2005,17 @@ static int editor_el_emerald_mine[] = EL_AMOEBA_WET, EL_AMOEBA_DRY, +#if 1 + EL_EM_KEY_1, + EL_EM_KEY_2, + EL_EM_KEY_3, + EL_EM_KEY_4, +#else EL_EM_KEY_1_FILE, EL_EM_KEY_2_FILE, EL_EM_KEY_3_FILE, EL_EM_KEY_4_FILE, +#endif EL_EM_GATE_1, EL_EM_GATE_2, @@ -2078,17 +2095,17 @@ static int editor_el_more[] = EL_PIG, EL_DRAGON, - EL_EMPTY, + EL_BUG, EL_MOLE_UP, - EL_EMPTY, - EL_EMPTY, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, EL_MOLE_LEFT, EL_EMPTY, EL_MOLE_RIGHT, - EL_EMPTY, + EL_PACMAN, - EL_EMPTY, + EL_SPACESHIP, EL_MOLE_DOWN, EL_BALLOON, EL_BALLOON_SWITCH_ANY, @@ -2159,7 +2176,11 @@ static int editor_hl_supaplex[] = static int editor_el_supaplex[] = { +#if 1 + EL_EMPTY, +#else EL_SP_EMPTY, +#endif EL_SP_ZONK, EL_SP_BASE, EL_SP_MURPHY, @@ -2275,7 +2296,12 @@ static int editor_el_diamond_caves[] = EL_SWITCHGATE_OPEN, EL_SWITCHGATE_CLOSED, EL_SWITCHGATE_SWITCH_UP, - EL_ENVELOPE, + EL_EMPTY, + + EL_ENVELOPE_1, + EL_ENVELOPE_2, + EL_ENVELOPE_3, + EL_ENVELOPE_4, EL_TIMEGATE_CLOSED, EL_TIMEGATE_OPEN, @@ -2889,14 +2915,81 @@ editor_elements_info[] = ----------------------------------------------------------------------------- */ +static int getMaxInfoTextLength() +{ + return (SXSIZE / getFontWidth(FONT_TEXT_2)); +} + +static int getTextWidthForGadget(char *text) +{ + if (text == NULL) + return 0; + + return (getTextWidth(text, FONT_TEXT_1) + ED_GADGET_TEXT_DISTANCE); +} + +static int getTextWidthForDrawingArea(char *text) +{ + if (text == NULL) + return 0; + + return (getTextWidth(text, FONT_TEXT_1) + ED_DRAWINGAREA_TEXT_DISTANCE); +} + +static int getRightGadgetBorder(struct GadgetInfo *gi, char *text) +{ + return (gi->x + gi->width + getTextWidthForGadget(text)); +} + +static char *getElementInfoText(int element) +{ + char *info_text = NULL; + + if (element < NUM_FILE_ELEMENTS) + { + if (strlen(element_info[element].description) > 0) + info_text = element_info[element].description; + else if (element_info[element].custom_description != NULL) + info_text = element_info[element].custom_description; + else if (element_info[element].editor_description != NULL) + info_text = element_info[element].editor_description; + } + + if (info_text == NULL) + info_text = INFOTEXT_UNKNOWN_ELEMENT; + + return info_text; +} + static void ReinitializeElementList() { + static boolean initialized = FALSE; int pos = 0; int i, j; if (editor_elements != NULL) free(editor_elements); + /* do some sanity check for each element from element list at startup */ + if (!initialized) + { + for (i=0; editor_elements_info[i].setup_value != NULL; i++) + { + for (j=0; j < *editor_elements_info[i].element_list_size; j++) + { + int element = editor_elements_info[i].element_list[j]; + + if (element >= NUM_FILE_ELEMENTS) + Error(ERR_WARN, "editor element %d is runtime element", element); + + if (strcmp(getElementInfoText(element), INFOTEXT_UNKNOWN_ELEMENT) == 0) + Error(ERR_WARN, "no element description for element %d", element); + } + } + + initialized = TRUE; + } + num_editor_elements = 0; /* determine size of element list */ @@ -2975,56 +3068,6 @@ static void ReinitializeElementListButtons() initialization_needed = FALSE; } -static int getMaxInfoTextLength() -{ - return (SXSIZE / getFontWidth(FONT_TEXT_2)); -} - -static int getTextWidthForGadget(char *text) -{ - if (text == NULL) - return 0; - - return (getTextWidth(text, FONT_TEXT_1) + ED_GADGET_TEXT_DISTANCE); -} - -static int getTextWidthForDrawingArea(char *text) -{ - if (text == NULL) - return 0; - - return (getTextWidth(text, FONT_TEXT_1) + ED_DRAWINGAREA_TEXT_DISTANCE); -} - -static int getRightGadgetBorder(struct GadgetInfo *gi, char *text) -{ - return (gi->x + gi->width + getTextWidthForGadget(text)); -} - -static char *getElementInfoText(int element) -{ - char *info_text = NULL; - - if (element < NUM_FILE_ELEMENTS) - { - if (strlen(element_info[element].description) > 0) - info_text = element_info[element].description; - else if (element_info[element].custom_description != NULL) - info_text = element_info[element].custom_description; - else if (element_info[element].editor_description != NULL) - info_text = element_info[element].editor_description; - } - - if (info_text == NULL) - { - info_text = "unknown"; - - Error(ERR_WARN, "no element description for element %d", element); - } - - return info_text; -} - static void DrawElementBorder(int dest_x, int dest_y, int width, int height, boolean input) { @@ -3281,7 +3324,7 @@ static void CreateControlButtons() } /* create buttons for element list */ - for (i=0; ix, gi->y, gi->width, gi->height); - ModifyGadget(gi, GDI_AREA_SIZE, level.envelope_xsize, level.envelope_ysize, + if (envelope_nr != -1) + textarea_info[id].value = level.envelope_text[envelope_nr]; + + ModifyGadget(gi, GDI_AREA_SIZE, + *counterbutton_info[ED_COUNTER_ID_ENVELOPE_XSIZE].value, + *counterbutton_info[ED_COUNTER_ID_ENVELOPE_YSIZE].value, GDI_END); + MapTextAreaGadget(ED_TEXTAREA_ID_ENVELOPE_INFO); } @@ -5328,7 +5383,7 @@ static void DrawPropertiesInfo() { EP_DONT_COLLIDE_WITH, "- deadly when colliding with" }, { EP_DONT_TOUCH, "- deadly when touching" }, - { EP_INDESTRUCTIBLE, "- undestructible" }, + { EP_INDESTRUCTIBLE, "- indestructible" }, { EP_CAN_EXPLODE_BY_FIRE, "- can explode by fire or explosions" }, { EP_CAN_EXPLODE_SMASHED, "- can explode when smashed" }, @@ -5461,10 +5516,17 @@ static struct { EL_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING }, +#if 1 + { EL_EM_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EM_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EM_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EM_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING }, +#else { EL_EM_KEY_1_FILE, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_EM_KEY_2_FILE, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_EM_KEY_3_FILE, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_EM_KEY_4_FILE, &level.score[SC_KEY], TEXT_COLLECTING }, +#endif { EL_AMOEBA_WET, &level.amoeba_speed, TEXT_SPEED }, { EL_AMOEBA_DRY, &level.amoeba_speed, TEXT_SPEED }, { EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_SPEED }, @@ -5480,8 +5542,8 @@ static boolean checkPropertiesConfig() if (IS_GEM(properties_element) || IS_CUSTOM_ELEMENT(properties_element) || - HAS_CONTENT(properties_element) || - properties_element == EL_ENVELOPE) + IS_ENVELOPE(properties_element) || + HAS_CONTENT(properties_element)) return TRUE; else for (i=0; elements_with_counter[i].element != -1; i++) @@ -5533,13 +5595,20 @@ static void DrawPropertiesConfig() if (IS_GEM(properties_element)) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS); - if (properties_element == EL_ENVELOPE) + if (IS_ENVELOPE(properties_element)) { + int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE; + int counter2_id = ED_COUNTER_ID_ENVELOPE_YSIZE; + int envelope_nr = properties_element - EL_ENVELOPE_1; + + counterbutton_info[counter1_id].value = &level.envelope_xsize[envelope_nr]; + counterbutton_info[counter2_id].value = &level.envelope_ysize[envelope_nr]; + /* display counter to choose size of envelope text area */ MapCounterButtons(ED_COUNTER_ID_ENVELOPE_XSIZE); MapCounterButtons(ED_COUNTER_ID_ENVELOPE_YSIZE); - DrawEnvelopeTextArea(); + DrawEnvelopeTextArea(envelope_nr); } if (IS_CUSTOM_ELEMENT(properties_element)) @@ -6655,7 +6724,7 @@ static void HandleCounterButtons(struct GadgetInfo *gi) case ED_COUNTER_ID_ENVELOPE_XSIZE: case ED_COUNTER_ID_ENVELOPE_YSIZE: - DrawEnvelopeTextArea(); + DrawEnvelopeTextArea(-1); break; case ED_COUNTER_ID_LEVEL_XSIZE: @@ -7509,10 +7578,12 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed) Request("Level has changed! Exit without saving ?", REQ_ASK | REQ_STAY_OPEN)) { +#if 1 CloseDoor(DOOR_CLOSE_1); - /* + SetDoorState(DOOR_CLOSE_2); +#else CloseDoor(DOOR_CLOSE_ALL); - */ +#endif game_status = GAME_MODE_MAIN; DrawMainMenu(); }