X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=c58d03efa120d15c34f053ada3f1425808606176;hb=12e44cdc1d38afab5da1ea3057e0c285a7a48356;hp=2c878e4a47f878e57d6dd2d8186c5fff4bdec92e;hpb=e4bc04ce0cb3fd188b2dcc362c7f3afe692124a7;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 2c878e4a..c58d03ef 100644 --- a/src/editor.c +++ b/src/editor.c @@ -144,8 +144,15 @@ ED_GADGET_DISTANCE) /* custom element content */ #define ED_AREA_ELEM_CONTENT4_XPOS (29 * MINI_TILEX) -#define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(12) + \ +#define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(13) + \ ED_GADGET_DISTANCE - MINI_TILEY) +/* movement enter/leave element */ +#define ED_AREA_ELEM_CONTENT4a_XPOS (29 * MINI_TILEX) +#define ED_AREA_ELEM_CONTENT4a_YPOS (ED_SETTINGS_YPOS(7) + \ + ED_GADGET_DISTANCE) +#define ED_AREA_ELEM_CONTENT4b_XPOS (29 * MINI_TILEX) +#define ED_AREA_ELEM_CONTENT4b_YPOS (ED_SETTINGS_YPOS(7) + \ + ED_GADGET_DISTANCE) /* custom change trigger element */ #define ED_AREA_ELEM_CONTENT5_YPOS (ED_SETTINGS_YPOS(6) + \ ED_GADGET_DISTANCE) @@ -397,14 +404,16 @@ #define GADGET_ID_AMOEBA_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 9) #define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 10) #define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 11) -#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 12) -#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 13) -#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 14) -#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 15) -#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 16) +#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 12) +#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 13) +#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 14) +#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 15) +#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 16) +#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 17) +#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 18) /* text input identifiers */ -#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 17) +#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 19) #define GADGET_ID_LEVEL_NAME (GADGET_ID_TEXT_INPUT_FIRST + 0) #define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1) @@ -424,19 +433,20 @@ #define GADGET_ID_CUSTOM_MOVE_PATTERN (GADGET_ID_SELECTBOX_FIRST + 3) #define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 4) #define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 5) -#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 6) -#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 7) -#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_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) +#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 6) +#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 7) +#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 8) +#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 9) +#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 10) +#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 11) +#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 13) +#define GADGET_ID_CHANGE_SIDES (GADGET_ID_SELECTBOX_FIRST + 14) +#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 15) +#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 16) /* textbutton identifiers */ -#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 16) +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 17) #define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) #define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) @@ -594,18 +604,19 @@ #define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 3 #define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 4 #define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 5 -#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 6 -#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 7 -#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_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 - -#define ED_NUM_SELECTBOX 16 +#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 6 +#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 7 +#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 8 +#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 9 +#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 10 +#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 11 +#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 12 +#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 13 +#define ED_SELECTBOX_ID_CHANGE_SIDES 14 +#define ED_SELECTBOX_ID_CHANGE_POWER 15 +#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 16 + +#define ED_NUM_SELECTBOX 17 #define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE #define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_CONSISTENCY @@ -699,13 +710,15 @@ #define ED_DRAWING_ID_AMOEBA_CONTENT 9 #define ED_DRAWING_ID_CUSTOM_GRAPHIC 10 #define ED_DRAWING_ID_CUSTOM_CONTENT 11 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 12 -#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 13 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 14 -#define ED_DRAWING_ID_GROUP_CONTENT 15 -#define ED_DRAWING_ID_RANDOM_BACKGROUND 16 +#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 12 +#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 13 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 14 +#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 15 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 16 +#define ED_DRAWING_ID_GROUP_CONTENT 17 +#define ED_DRAWING_ID_RANDOM_BACKGROUND 18 -#define ED_NUM_DRAWING_AREAS 17 +#define ED_NUM_DRAWING_AREAS 19 /* @@ -947,7 +960,7 @@ static struct NULL, "+random", NULL }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), 0, 999, GADGET_ID_MOVE_DELAY_FIX_DOWN, GADGET_ID_MOVE_DELAY_FIX_UP, GADGET_ID_MOVE_DELAY_FIX_TEXT, GADGET_ID_NONE, @@ -955,7 +968,7 @@ static struct NULL, "move delay", NULL }, { - -1, ED_SETTINGS_YPOS(7), + -1, ED_SETTINGS_YPOS(9), 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, @@ -1105,11 +1118,13 @@ static struct ValueTextInfo options_move_pattern[] = static struct ValueTextInfo options_move_direction[] = { - { MV_NO_MOVING, "automatic" }, + { MV_AUTOMATIC, "automatic" }, { MV_LEFT, "left" }, { MV_RIGHT, "right" }, { MV_UP, "up" }, { MV_DOWN, "down" }, + { MV_RANDOM, "random" }, + { MV_PREVIOUS, "previous" }, { -1, NULL } }; @@ -1123,6 +1138,13 @@ static struct ValueTextInfo options_move_stepsize[] = { -1, NULL } }; +static struct ValueTextInfo options_move_leave_type[] = +{ + { LEAVE_TYPE_UNLIMITED, "leave behind" }, + { LEAVE_TYPE_LIMITED, "change to" }, + { -1, NULL } +}; + static struct ValueTextInfo options_smash_targets[] = { { EP_CAN_SMASH_PLAYER, "player" }, @@ -1296,7 +1318,15 @@ static struct "move/fall speed", NULL, "speed of element movement" }, { - -1, ED_SETTINGS_YPOS(9), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), + GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, GADGET_ID_NONE, + -1, + options_move_leave_type, + &custom_element.move_leave_type, + "can dig: can", ":", "leave behind or change element" + }, + { + -1, ED_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH, -1, options_smash_targets, @@ -1304,7 +1334,7 @@ static struct "can smash", NULL, "elements that can be smashed" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_SLIPPERY_TYPE, GADGET_ID_NONE, -1, options_slippery_type, @@ -1312,7 +1342,7 @@ static struct "slippery", NULL, "where other elements fall down" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12), GADGET_ID_CUSTOM_DEADLINESS, GADGET_ID_NONE, -1, options_deadliness, @@ -1320,7 +1350,7 @@ static struct "deadly when", NULL, "deadliness of element" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13), GADGET_ID_CUSTOM_CONSISTENCY, GADGET_ID_NONE, -1, options_consistency, @@ -1632,49 +1662,49 @@ static struct NULL, NULL, "element can move in some direction" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(9), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10), 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(9), + -1, ED_SETTINGS_YPOS(10), 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(10), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE, &custom_element_properties[EP_SLIPPERY], NULL, NULL, "other elements can fall down from it" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(12), 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(12), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13), GADGET_ID_CUSTOM_EXPLODE_RESULT, GADGET_ID_NONE, &custom_element_properties[EP_EXPLODE_RESULT], NULL, NULL, "set consistency/destructibility" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(14), GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE, &custom_element.can_explode_by_fire, NULL, "by fire", "element can explode by fire/explosion" }, { - -1, ED_SETTINGS_YPOS(13), + -1, ED_SETTINGS_YPOS(14), GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE, &custom_element.can_explode_smashed, " ", "smashed", "element can explode when smashed" }, { - -1, ED_SETTINGS_YPOS(13), + -1, ED_SETTINGS_YPOS(14), GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH, &custom_element.can_explode_impact, " ", "impact", "element can explode on impact" @@ -1840,6 +1870,21 @@ static struct "content:", NULL, NULL }, + /* ---------- custom enter and leave element (when moving) --------------- */ + + { + ED_SETTINGS_XPOS(1), ED_AREA_ELEM_CONTENT4a_YPOS, + 1, 1, + GADGET_ID_CUSTOM_MOVE_ENTER, GADGET_ID_NONE, + "can dig:", " ", NULL + }, + { + -1, ED_AREA_ELEM_CONTENT4b_YPOS, + 1, 1, + GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, + NULL, NULL, NULL + }, + /* ---------- custom change target --------------------------------------- */ { @@ -2182,11 +2227,7 @@ static int editor_el_more[] = EL_BD_FIREFLY, EL_MOLE_LEFT, -#if 0 - EL_MAZE_RUNNER, -#else EL_EMPTY, -#endif EL_MOLE_RIGHT, EL_PACMAN, @@ -2243,7 +2284,7 @@ static int editor_el_sokoban[] = EL_SOKOBAN_OBJECT, EL_SOKOBAN_FIELD_EMPTY, EL_SOKOBAN_FIELD_FULL, - EL_STEELWALL, + EL_SOKOBAN_FIELD_PLAYER, }; static int *editor_hl_sokoban_ptr = editor_hl_sokoban; static int *editor_el_sokoban_ptr = editor_el_sokoban; @@ -3143,6 +3184,205 @@ editor_elements_info[] = } }; +static struct +{ + short element; + short element_mapped; +} +forum_sketch_element_mapping[] = +{ + { EL_WALL_SLIPPERY, EL_WALL }, + { EL_EXPANDABLE_WALL, EL_WALL }, + { EL_EXPANDABLE_WALL_HORIZONTAL, EL_WALL }, + { EL_EXPANDABLE_WALL_VERTICAL, EL_WALL }, + { EL_EXPANDABLE_WALL_ANY, EL_WALL }, + { EL_WALL_EMERALD, EL_WALL }, + { EL_WALL_DIAMOND, EL_WALL }, + { EL_WALL_BD_DIAMOND, EL_WALL }, + { EL_WALL_EMERALD_YELLOW, EL_WALL }, + { EL_WALL_EMERALD_RED, EL_WALL }, + { EL_WALL_EMERALD_PURPLE, EL_WALL }, + { EL_ACID_POOL_TOPLEFT, EL_WALL }, + { EL_ACID_POOL_TOPRIGHT, EL_WALL }, + { EL_ACID_POOL_BOTTOMLEFT, EL_WALL }, + { EL_ACID_POOL_BOTTOM, EL_WALL }, + { EL_ACID_POOL_BOTTOMRIGHT, EL_WALL }, + { EL_BD_WALL, EL_WALL }, + + { EL_BD_ROCK, EL_ROCK }, + + { EL_SP_ZONK, EL_ROCK }, + { EL_SP_BASE, EL_SAND }, + { EL_SP_MURPHY, EL_PLAYER_1 }, + { EL_SP_INFOTRON, EL_EMERALD }, + { EL_SP_HARDWARE_GRAY, EL_STEELWALL }, + { EL_SP_EXIT_CLOSED, EL_EXIT_OPEN }, + { EL_SP_DISK_ORANGE, EL_BOMB }, + { EL_SP_DISK_RED, EL_BOMB }, + { EL_SP_DISK_YELLOW, EL_BOMB }, + { EL_SP_PORT_RIGHT, EL_GATE_1_GRAY }, + { EL_SP_PORT_DOWN, EL_GATE_1_GRAY }, + { EL_SP_PORT_LEFT, EL_GATE_1_GRAY }, + { EL_SP_PORT_UP, EL_GATE_1_GRAY }, + { EL_SP_GRAVITY_PORT_RIGHT, EL_GATE_1_GRAY }, + { EL_SP_GRAVITY_PORT_DOWN, EL_GATE_1_GRAY }, + { EL_SP_GRAVITY_PORT_LEFT, EL_GATE_1_GRAY }, + { EL_SP_GRAVITY_PORT_UP, EL_GATE_1_GRAY }, + { EL_SP_PORT_VERTICAL, EL_GATE_1_GRAY }, + { EL_SP_PORT_HORIZONTAL, EL_GATE_1_GRAY }, + { EL_SP_PORT_ANY, EL_GATE_1_GRAY }, + { EL_SP_SNIKSNAK, EL_BUG }, + { EL_SP_ELECTRON, EL_SPACESHIP }, + { EL_SP_CHIP_SINGLE, EL_WALL }, + { EL_SP_CHIP_LEFT, EL_WALL }, + { EL_SP_CHIP_RIGHT, EL_WALL }, + { EL_SP_CHIP_TOP, EL_WALL }, + { EL_SP_CHIP_BOTTOM, EL_WALL }, + { EL_SP_HARDWARE_BASE_1, EL_STEELWALL }, + { EL_SP_HARDWARE_GREEN, EL_STEELWALL }, + { EL_SP_HARDWARE_BLUE, EL_STEELWALL }, + { EL_SP_HARDWARE_RED, EL_STEELWALL }, + { EL_SP_HARDWARE_YELLOW, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_2, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_3, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_3, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_4, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_5, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_6, EL_STEELWALL }, + + { EL_STEELWALL_SLIPPERY, EL_STEELWALL }, + + { EL_EXIT_CLOSED, EL_EXIT_OPEN }, + + { EL_DIAMOND, EL_EMERALD }, + { EL_BD_DIAMOND, EL_EMERALD }, + { EL_EMERALD_YELLOW, EL_EMERALD }, + { EL_EMERALD_RED, EL_EMERALD }, + { EL_EMERALD_PURPLE, EL_EMERALD }, + + { EL_AMOEBA_DEAD, EL_AMOEBA }, + { EL_AMOEBA_DROP, EL_AMOEBA }, + { EL_AMOEBA_WET, EL_AMOEBA }, + { EL_AMOEBA_DRY, EL_AMOEBA }, + { EL_AMOEBA_FULL, EL_AMOEBA }, + { EL_BD_AMOEBA, EL_AMOEBA }, + { EL_AMOEBA_TO_DIAMOND, EL_AMOEBA }, + + { EL_DYNAMITE_ACTIVE, EL_DYNAMITE }, + + { EL_GATE_2_GRAY, EL_GATE_1_GRAY }, + { EL_GATE_3_GRAY, EL_GATE_1_GRAY }, + { EL_GATE_4_GRAY, EL_GATE_1_GRAY }, + + { EL_EM_KEY_1, EL_KEY_1 }, + { EL_EM_KEY_2, EL_KEY_2 }, + { EL_EM_KEY_3, EL_KEY_3 }, + { EL_EM_KEY_4, EL_KEY_4 }, + + { EL_EM_GATE_1, EL_GATE_1 }, + { EL_EM_GATE_2, EL_GATE_2 }, + { EL_EM_GATE_3, EL_GATE_3 }, + { EL_EM_GATE_4, EL_GATE_4 }, + + { EL_EM_GATE_1_GRAY, EL_GATE_1_GRAY }, + { EL_EM_GATE_2_GRAY, EL_GATE_1_GRAY }, + { EL_EM_GATE_3_GRAY, EL_GATE_1_GRAY }, + { EL_EM_GATE_4_GRAY, EL_GATE_1_GRAY }, + + { EL_INVISIBLE_SAND, EL_EMPTY }, + { EL_INVISIBLE_WALL, EL_EMPTY }, + { EL_INVISIBLE_STEELWALL, EL_EMPTY }, + + { EL_PACMAN, EL_YAMYAM }, + { EL_DARK_YAMYAM, EL_YAMYAM }, + + { EL_BD_MAGIC_WALL, EL_MAGIC_WALL }, + + { EL_DYNABOMB_INCREASE_NUMBER, EL_BOMB }, + { EL_DYNABOMB_INCREASE_SIZE, EL_BOMB }, + { EL_DYNABOMB_INCREASE_POWER, EL_BOMB }, + { EL_BLACK_ORB, EL_BOMB }, + { EL_DX_SUPABOMB, EL_BOMB }, + + { EL_SOKOBAN_OBJECT, EL_KEY_1 }, + { EL_SOKOBAN_FIELD_EMPTY, EL_GATE_1_GRAY }, + { EL_SOKOBAN_FIELD_FULL, EL_GATE_1 }, + { EL_SOKOBAN_FIELD_PLAYER, EL_PLAYER_1 }, + + { EL_BD_BUTTERFLY_RIGHT, EL_BD_BUTTERFLY }, + { EL_BD_BUTTERFLY_UP, EL_BD_BUTTERFLY }, + { EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY }, + { EL_BD_BUTTERFLY_DOWN, EL_BD_BUTTERFLY }, + + { EL_BD_FIREFLY_RIGHT, EL_BD_FIREFLY }, + { EL_BD_FIREFLY_UP, EL_BD_FIREFLY }, + { EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY }, + { EL_BD_FIREFLY_DOWN, EL_BD_FIREFLY }, + + { EL_PLAYER_2, EL_PLAYER_1 }, + { EL_PLAYER_3, EL_PLAYER_1 }, + { EL_PLAYER_4, EL_PLAYER_1 }, + + { EL_BUG_RIGHT, EL_BUG }, + { EL_BUG_UP, EL_BUG }, + { EL_BUG_LEFT, EL_BUG }, + { EL_BUG_DOWN, EL_BUG }, + + { EL_SPACESHIP_RIGHT, EL_SPACESHIP }, + { EL_SPACESHIP_UP, EL_SPACESHIP }, + { EL_SPACESHIP_LEFT, EL_SPACESHIP }, + { EL_SPACESHIP_DOWN, EL_SPACESHIP }, + + { EL_PACMAN_RIGHT, EL_YAMYAM }, + { EL_PACMAN_UP, EL_YAMYAM }, + { EL_PACMAN_LEFT, EL_YAMYAM }, + { EL_PACMAN_DOWN, EL_YAMYAM }, + + { -1, -1 } +}; + +static struct +{ + short element; + char *element_string; +} +forum_sketch_element_strings[] = +{ + { EL_PLAYER_1, "p" }, + { EL_EMPTY, "_" }, + { EL_SAND, "s" }, + { EL_ROCK, "b" }, + { EL_EMERALD, "e" }, + { EL_BUG, "u" }, + { EL_SPACESHIP, "h" }, + { EL_BD_FIREFLY, "f" }, + { EL_BD_BUTTERFLY, "b" }, + { EL_AMOEBA, "a" }, + { EL_YAMYAM, "y" }, + { EL_WALL, "w" }, + { EL_STEELWALL, "t" }, + { EL_MAGIC_WALL, "m" }, + { EL_EXIT_OPEN, "x" }, + { EL_DYNAMITE, "d" }, + { EL_KEY_1, "1" }, + { EL_KEY_2, "2" }, + { EL_KEY_3, "3" }, + { EL_KEY_4, "4" }, + { EL_GATE_1, "5" }, + { EL_GATE_2, "6" }, + { EL_GATE_3, "7" }, + { EL_GATE_4, "8" }, + { EL_GATE_1_GRAY, "9" }, + { EL_BOMB, "@" }, + { EL_ROBOT, "r" }, + { EL_ROBOT_WHEEL, "0" }, + { EL_NUT, "n" }, + { EL_CUSTOM_1, "c" }, + { EL_CHAR_QUESTION, "?" }, + + { -1, NULL } +}; + /* ----------------------------------------------------------------------------- @@ -3381,6 +3621,12 @@ static void DrawDrawingArea(int id) DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, el2edimg(custom_element.content[x][y])); + else if (id == ED_DRAWING_ID_CUSTOM_MOVE_ENTER) + DrawMiniGraphicExt(drawto, gi->x, gi->y, + el2edimg(custom_element.move_enter_element)); + else if (id == ED_DRAWING_ID_CUSTOM_MOVE_LEAVE) + DrawMiniGraphicExt(drawto, gi->x, gi->y, + el2edimg(custom_element.move_leave_element)); else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TARGET) DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(custom_element_change.target_element)); @@ -4847,6 +5093,40 @@ static int setSelectboxValue(int selectbox_id, int new_value) static void copy_custom_element_settings(int element_from, int element_to) { +#if 1 + struct ElementInfo ei_to_old = element_info[element_to]; + struct ElementInfo *ei_from = &element_info[element_from]; + struct ElementInfo *ei_to = &element_info[element_to]; + int i; + + /* ---------- copy whole element structure ---------- */ + *ei_to = *ei_from; + + /* ---------- restore structure pointers which cannot be copied ---------- */ + ei_to->token_name = ei_to_old.token_name; + ei_to->class_name = ei_to_old.class_name; + ei_to->editor_description = ei_to_old.editor_description; + ei_to->custom_description = ei_to_old.custom_description; + ei_to->change_page = ei_to_old.change_page; + ei_to->change = ei_to_old.change; + ei_to->group = ei_to_old.group; + + /* ---------- copy element base properties ---------- */ + Properties[element_to][EP_BITFIELD_BASE] = + Properties[element_from][EP_BITFIELD_BASE]; + + /* ---------- reinitialize and copy change pages ---------- */ + setElementChangePages(ei_to, ei_to->num_change_pages); + + for (i=0; i < ei_to->num_change_pages; i++) + ei_to->change_page[i] = ei_from->change_page[i]; + + /* ---------- copy group element info ---------- */ + if (ei_from->group != NULL && ei_to->group != NULL) /* group or internal */ + *ei_to->group = *ei_from->group; + +#else + struct ElementInfo *ei_from = &element_info[element_from]; struct ElementInfo *ei_to = &element_info[element_to]; int i, x, y; @@ -4919,6 +5199,7 @@ static void copy_custom_element_settings(int element_from, int element_to) change_to->sides = change_from->sides; } +#endif /* mark this custom element as modified */ ei_to->modified_settings = TRUE; @@ -4938,7 +5219,7 @@ static void replace_custom_element_in_settings(int element_from, if (ei->content[x][y] == element_from) ei->content[x][y] = element_to; - for (j=0; j < ei->num_change_pages; j++) + for (j = 0; j < ei->num_change_pages; j++) { struct ElementChangeInfo *change = &ei->change_page[j]; @@ -4953,6 +5234,11 @@ static void replace_custom_element_in_settings(int element_from, if (change->content[x][y] == element_from) change->content[x][y] = element_to; } + + if (ei->group != NULL) /* group or internal */ + for (j = 0; j < MAX_ELEMENTS_IN_GROUP; j++) + if (ei->group->element[j] == element_from) + ei->group->element[j] = element_to; } } @@ -4967,8 +5253,22 @@ static void replace_custom_element_in_playfield(int element_from, Feld[x][y] = element_to; } -static void CopyCustomElement(int element_old, int element_new, int copy_mode) +static boolean CopyCustomElement(int element_old, int element_new, + int copy_mode) { + if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new)) + { + Request("Please choose custom element !", REQ_CONFIRM); + + return FALSE; + } + else if (IS_GROUP_ELEMENT(element_old) && !IS_GROUP_ELEMENT(element_new)) + { + Request("Please choose group element !", REQ_CONFIRM); + + return FALSE; + } + if (copy_mode == GADGET_ID_CUSTOM_COPY_FROM) { copy_custom_element_settings(element_new, element_old); @@ -4979,21 +5279,23 @@ static void CopyCustomElement(int element_old, int element_new, int copy_mode) } else if (copy_mode == GADGET_ID_CUSTOM_EXCHANGE) { - copy_custom_element_settings(element_old, EL_DUMMY); + copy_custom_element_settings(element_old, EL_INTERNAL_EDITOR); copy_custom_element_settings(element_new, element_old); - copy_custom_element_settings(EL_DUMMY, element_new); + copy_custom_element_settings(EL_INTERNAL_EDITOR, element_new); - replace_custom_element_in_settings(element_old, EL_DUMMY); + replace_custom_element_in_settings(element_old, EL_INTERNAL_EDITOR); replace_custom_element_in_settings(element_new, element_old); - replace_custom_element_in_settings(EL_DUMMY, element_new); + replace_custom_element_in_settings(EL_INTERNAL_EDITOR, element_new); - replace_custom_element_in_playfield(element_old, EL_DUMMY); + replace_custom_element_in_playfield(element_old, EL_INTERNAL_EDITOR); replace_custom_element_in_playfield(element_new, element_old); - replace_custom_element_in_playfield(EL_DUMMY, element_new); + replace_custom_element_in_playfield(EL_INTERNAL_EDITOR, element_new); } UpdateCustomElementGraphicGadgets(); DrawPropertiesWindow(); + + return TRUE; } static void CopyCustomElementPropertiesToEditor(int element) @@ -6218,6 +6520,8 @@ static void DrawPropertiesConfig() /* draw drawing area gadgets */ DrawCustomContentArea(); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_ENTER); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_LEAVE); /* draw text input gadgets */ MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME); @@ -6369,7 +6673,8 @@ static void DrawPropertiesWindow() UnmapLevelEditorToolboxDrawingGadgets(); UnmapLevelEditorToolboxCustomGadgets(); - if (IS_CUSTOM_ELEMENT(properties_element)) + if (IS_CUSTOM_ELEMENT(properties_element) || + IS_GROUP_ELEMENT(properties_element)) MapLevelEditorToolboxCustomGadgets(); SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); @@ -6615,6 +6920,7 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y, #define CB_BRUSH_TO_CURSOR 1 #define CB_BRUSH_TO_LEVEL 2 #define CB_DELETE_OLD_CURSOR 3 +#define CB_DUMP_BRUSH 4 static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, int button, int mode) @@ -6626,6 +6932,54 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, int new_element = BUTTON_ELEMENT(button); int x, y; + if (mode == CB_DUMP_BRUSH) + { + if (!draw_with_brush) + { + Error(ERR_WARN, "no brush selected"); + + return; + } + + for (y = 0; y < brush_height; y++) + { + for (x = 0; x < brush_width; x++) + { + int element = brush_buffer[x][y]; + int element_mapped = element; + char *element_string = "?"; + int k; + + for (k = 0; forum_sketch_element_mapping[k].element != -1; k++) + { + if (forum_sketch_element_mapping[k].element == element) + { + element_mapped = forum_sketch_element_mapping[k].element_mapped; + break; + } + } + + if (IS_CUSTOM_ELEMENT(element)) + element_mapped = EL_CUSTOM_1; + + for (k = 0; forum_sketch_element_strings[k].element != -1; k++) + { + if (forum_sketch_element_strings[k].element == element_mapped) + { + element_string = forum_sketch_element_strings[k].element_string; + break; + } + } + + printf("`%s", element_string); + } + + printf("\n"); + } + + return; + } + if (mode == CB_DELETE_OLD_CURSOR && !delete_old_brush) return; @@ -6740,6 +7094,11 @@ static void DeleteBrushFromCursor() CopyBrushExt(0, 0, 0, 0, 0, CB_DELETE_OLD_CURSOR); } +void DumpBrush() +{ + CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH); +} + static void FloodFill(int from_x, int from_y, int fill_element) { int i,x,y; @@ -7161,6 +7520,18 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) CopyCustomElementPropertiesToGame(properties_element); } + else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) + { + custom_element.move_enter_element = new_element; + + CopyCustomElementPropertiesToGame(properties_element); + } + else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) + { + custom_element.move_leave_element = new_element; + + CopyCustomElementPropertiesToGame(properties_element); + } else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) { custom_element_change.target_element = new_element; @@ -7295,6 +7666,10 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) PickDrawingElement(button, custom_element.gfx_element); else if (id == GADGET_ID_CUSTOM_CONTENT) PickDrawingElement(button, custom_element.content[sx][sy]); + else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) + PickDrawingElement(button, custom_element.move_enter_element); + else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) + PickDrawingElement(button, custom_element.move_leave_element); else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) PickDrawingElement(button, custom_element_change.target_element); else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) @@ -7580,6 +7955,10 @@ static void HandleControlButtons(struct GadgetInfo *gi) edit_mode = ED_MODE_DRAWING; } + /* element copy mode active, but no element button pressed => deactivate */ + if (last_custom_copy_mode != -1 && id < ED_NUM_CTRL_BUTTONS) + last_custom_copy_mode = -1; + switch (id) { case GADGET_ID_SCROLL_LEFT: @@ -7878,13 +8257,14 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (last_custom_copy_mode != -1) { - CopyCustomElement(properties_element, new_element, - last_custom_copy_mode); - - ClickOnGadget(level_editor_gadget[last_drawing_function], - MB_LEFTBUTTON); + if (CopyCustomElement(properties_element, new_element, + last_custom_copy_mode)) + { + ClickOnGadget(level_editor_gadget[last_drawing_function], + MB_LEFTBUTTON); - last_custom_copy_mode = -1; + last_custom_copy_mode = -1; + } break; } @@ -8072,7 +8452,6 @@ void HandleEditorGadgetInfoText(void *ptr) static void HandleDrawingAreaInfo(struct GadgetInfo *gi) { static int start_lx, start_ly; - char *infotext; int id = gi->custom_id; int sx = gi->event.x; int sy = gi->event.y; @@ -8082,6 +8461,11 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) int max_sx = gi->drawing.area_xsize - 1; int max_sy = gi->drawing.area_ysize - 1; int actual_drawing_function = drawing_function; + int max_infotext_len = getMaxInfoTextLength(); + char infotext[MAX_OUTPUT_LINESIZE + 1]; + char *text; + + infotext[0] = '\0'; /* start with empty info text */ /* pressed Control key: simulate picking element */ if (GetKeyModState() & KMOD_Control) @@ -8129,41 +8513,48 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) switch (actual_drawing_function) { case GADGET_ID_SINGLE_ITEMS: - infotext = "Drawing single items"; + text = "Drawing single items"; break; case GADGET_ID_CONNECTED_ITEMS: - infotext = "Drawing connected items"; + text = "Drawing connected items"; break; case GADGET_ID_LINE: - infotext = "Drawing line"; + text = "Drawing line"; break; case GADGET_ID_ARC: - infotext = "Drawing arc"; + text = "Drawing arc"; break; case GADGET_ID_TEXT: - infotext = "Setting text cursor"; + text = "Setting text cursor"; break; case GADGET_ID_RECTANGLE: - infotext = "Drawing rectangle"; + text = "Drawing rectangle"; break; case GADGET_ID_FILLED_BOX: - infotext = "Drawing filled box"; + text = "Drawing filled box"; break; case GADGET_ID_FLOOD_FILL: - infotext = "Flood fill"; + text = "Flood fill"; break; case GADGET_ID_GRAB_BRUSH: - infotext = "Grabbing brush"; + text = "Grabbing brush"; break; case GADGET_ID_PICK_ELEMENT: - infotext = "Picking element"; + text = "Picking element"; break; default: - infotext = "Drawing position"; + text = "Drawing position"; break; } +#if 1 + if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) + sprintf(infotext, "%s: %d, %d", text, lx, ly); + else + sprintf(infotext, "%s: %d, %d", text, + ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1); +#else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s: %d, %d", infotext, lx, ly); @@ -8171,13 +8562,21 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s: %d, %d", infotext, ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1); +#endif } +#if 1 + else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) + strncpy(infotext, getElementInfoText(Feld[lx][ly]), max_infotext_len); + else + sprintf(infotext, "Level position: %d, %d", lx, ly); +#else else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", getElementInfoText(Feld[lx][ly])); else DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "Level position: %d, %d", lx, ly); +#endif } /* misuse this function to draw brush cursor, if needed */ @@ -8191,71 +8590,66 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) } else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) { + int element = EL_EMPTY; + if (id == GADGET_ID_AMOEBA_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(level.amoeba_content)); + element = level.amoeba_content; else if (id == GADGET_ID_CUSTOM_GRAPHIC) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element.gfx_element)); + element = custom_element.gfx_element; else if (id == GADGET_ID_CUSTOM_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element.content[sx][sy])); + element = custom_element.content[sx][sy]; + else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) + element = custom_element.move_enter_element; + else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) + element = custom_element.move_leave_element; else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element_change.target_element)); + element = custom_element_change.target_element; else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element_change.content[sx][sy])); + element = custom_element_change.content[sx][sy]; else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element_change.trigger_element)); + element = custom_element_change.trigger_element; else if (id == GADGET_ID_GROUP_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(group_element_info.element[sx])); + element = group_element_info.element[sx]; else if (id == GADGET_ID_RANDOM_BACKGROUND) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(random_placement_background_element)); + element = random_placement_background_element; else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && id <= GADGET_ID_ELEMENT_CONTENT_7) - { - int i = id - GADGET_ID_ELEMENT_CONTENT_0; + element = level.yamyam_content[id - GADGET_ID_ELEMENT_CONTENT_0][sx][sy]; - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(level.yamyam_content[i][sx][sy])); - } + strncpy(infotext, getElementInfoText(element), max_infotext_len); } else { if (id == GADGET_ID_AMOEBA_CONTENT) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Amoeba content"); + strcpy(infotext, "Amoeba content"); else if (id == GADGET_ID_CUSTOM_GRAPHIC) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Custom graphic element"); + strcpy(infotext, "Custom graphic element"); else if (id == GADGET_ID_CUSTOM_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Custom element content position: %d, %d", sx, sy); + sprintf(infotext, "Custom element content position: %d, %d", sx, sy); + else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) + strcpy(infotext, "Element that can be digged/collected"); + else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) + strcpy(infotext, "Element that will be left behind"); else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "New element after change"); + strcpy(infotext, "New element after change"); else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "New extended elements after change"); + strcpy(infotext, "New extended elements after change"); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Other element triggering change"); + strcpy(infotext, "Other element triggering change"); else if (id == GADGET_ID_GROUP_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Group element position: %d", sx + 1); + sprintf(infotext, "Group element position: %d", sx + 1); else if (id == GADGET_ID_RANDOM_BACKGROUND) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Random placement background"); + strcpy(infotext, "Random placement background"); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && id <= GADGET_ID_ELEMENT_CONTENT_7) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Content area %d position: %d, %d", - id - GADGET_ID_ELEMENT_CONTENT_0 + 1, sx, sy); + sprintf(infotext, "Content area %d position: %d, %d", + id - GADGET_ID_ELEMENT_CONTENT_0 + 1, sx, sy); } + + infotext[max_infotext_len] = '\0'; + + if (strlen(infotext) > 0) + DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, infotext); } void RequestExitLevelEditor(boolean ask_if_level_has_changed)