X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=0fb85a1a7fdc0c710f15e71333b11cfafc1ee6a8;hb=5e616edfe5f101927d2ff3f7a14d2c65897de3cc;hp=12053e073e7d9f6745413d40669c627a036cb20b;hpb=10b9382e55f3a8cd0a15644cf1ed6e1451654a76;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 12053e07..0fb85a1a 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", }, @@ -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" } }; @@ -1108,41 +1109,53 @@ static struct ValueTextInfo options_time_units[] = { -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" }, - { -1, NULL } -}; - -static struct ValueTextInfo options_change_collide_action[] = -{ - { CE_COLLISION, "on collision" }, - { CE_IMPACT, "on impact" }, - { CE_SMASHED, "when smashed" }, +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_COLLISION, "collision" }, + { CE_IMPACT, "impact" }, + { CE_SMASHED, "smashed" }, { -1, NULL } }; static struct ValueTextInfo options_change_other_action[] = { - { 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_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_CHANGING, "change of" }, + { CE_OTHER_IS_EXPLODING, "explosion of" }, + { -1, NULL } +}; + +static struct ValueTextInfo options_change_sides[] = +{ + { 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 +1184,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 +1192,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 +1200,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 +1208,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 +1216,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 +1224,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 +1232,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 +1240,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 +1248,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 +1256,7 @@ static struct -1, options_consistency, &custom_element.consistency, - NULL, NULL, "consistency/destructibility" + NULL, NULL, "consistency/destructibility" }, /* ---------- element settings: advanced (custom elements) --------------- */ @@ -1254,31 +1267,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 +1299,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 +1307,7 @@ static struct 3, options_change_page, &custom_element.current_change_page, - NULL, NULL, "element config page" + NULL, NULL, "element config page" }, }; @@ -1620,20 +1633,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" }, { @@ -1867,7 +1874,7 @@ static int edit_mode_properties; static int element_shift = 0; -static int editor_el_boulderdash[] = +static int editor_hl_boulderdash[] = { EL_CHAR('B'), EL_CHAR('O'), @@ -1883,7 +1890,10 @@ static int editor_el_boulderdash[] = EL_CHAR('A'), EL_CHAR('S'), EL_CHAR('H'), +}; +static int editor_el_boulderdash[] = +{ EL_PLAYER_1, EL_EMPTY, EL_SAND, @@ -1909,9 +1919,10 @@ static int editor_el_boulderdash[] = EL_BD_FIREFLY_DOWN, EL_EMPTY, }; +static int num_editor_hl_boulderdash = SIZEOF_ARRAY_INT(editor_hl_boulderdash); static int num_editor_el_boulderdash = SIZEOF_ARRAY_INT(editor_el_boulderdash); -static int editor_el_emerald_mine[] = +static int editor_hl_emerald_mine[] = { EL_CHAR('E'), EL_CHAR('M'), @@ -1927,7 +1938,10 @@ static int editor_el_emerald_mine[] = EL_CHAR('I'), EL_CHAR('N'), EL_CHAR('E'), +}; +static int editor_el_emerald_mine[] = +{ EL_PLAYER_1, EL_PLAYER_2, EL_PLAYER_3, @@ -1988,10 +2002,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, @@ -2003,15 +2024,19 @@ static int editor_el_emerald_mine[] = EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, }; -static int num_editor_el_emerald_mine = SIZEOF_ARRAY_INT(editor_el_emerald_mine); +static int num_editor_hl_emerald_mine=SIZEOF_ARRAY_INT(editor_hl_emerald_mine); +static int num_editor_el_emerald_mine=SIZEOF_ARRAY_INT(editor_el_emerald_mine); -static int editor_el_more[] = +static int editor_hl_more[] = { EL_CHAR('M'), EL_CHAR('O'), EL_CHAR('R'), EL_CHAR('E'), +}; +static int editor_el_more[] = +{ EL_KEY_1, EL_KEY_2, EL_KEY_3, @@ -2107,9 +2132,10 @@ static int editor_el_more[] = EL_EMC_WALL_6, EL_EMC_WALL_7, }; +static int num_editor_hl_more = SIZEOF_ARRAY_INT(editor_hl_more); static int num_editor_el_more = SIZEOF_ARRAY_INT(editor_el_more); -static int editor_el_sokoban[] = +static int editor_hl_sokoban[] = { EL_CHAR('S'), EL_CHAR('O'), @@ -2120,15 +2146,19 @@ static int editor_el_sokoban[] = EL_CHAR('B'), EL_CHAR('A'), EL_CHAR('N'), +}; +static int editor_el_sokoban[] = +{ EL_SOKOBAN_OBJECT, EL_SOKOBAN_FIELD_EMPTY, EL_SOKOBAN_FIELD_FULL, EL_STEELWALL, }; +static int num_editor_hl_sokoban = SIZEOF_ARRAY_INT(editor_hl_sokoban); static int num_editor_el_sokoban = SIZEOF_ARRAY_INT(editor_el_sokoban); -static int editor_el_supaplex[] = +static int editor_hl_supaplex[] = { EL_CHAR('S'), EL_CHAR('U'), @@ -2139,8 +2169,15 @@ static int editor_el_supaplex[] = EL_CHAR('L'), EL_CHAR('E'), EL_CHAR('X'), +}; +static int editor_el_supaplex[] = +{ +#if 1 + EL_EMPTY, +#else EL_SP_EMPTY, +#endif EL_SP_ZONK, EL_SP_BASE, EL_SP_MURPHY, @@ -2190,9 +2227,10 @@ static int editor_el_supaplex[] = EL_SP_CHIP_TOP, EL_SP_CHIP_BOTTOM, }; +static int num_editor_hl_supaplex = SIZEOF_ARRAY_INT(editor_hl_supaplex); static int num_editor_el_supaplex = SIZEOF_ARRAY_INT(editor_el_supaplex); -static int editor_el_diamond_caves[] = +static int editor_hl_diamond_caves[] = { EL_CHAR('D'), EL_CHAR('I'), @@ -2213,7 +2251,10 @@ static int editor_el_diamond_caves[] = EL_CHAR(' '), EL_CHAR('I'), EL_CHAR('I'), +}; +static int editor_el_diamond_caves[] = +{ EL_PEARL, EL_CRYSTAL, EL_WALL_PEARL, @@ -2252,7 +2293,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, @@ -2274,9 +2320,10 @@ static int editor_el_diamond_caves[] = EL_EXTRA_TIME, EL_EMPTY, }; +static int num_editor_hl_diamond_caves = SIZEOF_ARRAY_INT(editor_hl_diamond_caves); static int num_editor_el_diamond_caves = SIZEOF_ARRAY_INT(editor_el_diamond_caves); -static int editor_el_dx_boulderdash[] = +static int editor_hl_dx_boulderdash[] = { EL_CHAR('D'), EL_CHAR('X'), @@ -2297,7 +2344,10 @@ static int editor_el_dx_boulderdash[] = EL_CHAR('A'), EL_CHAR('S'), EL_CHAR('H'), +}; +static int editor_el_dx_boulderdash[] = +{ EL_SPRING, EL_TUBE_RIGHT_DOWN, EL_TUBE_HORIZONTAL_DOWN, @@ -2318,15 +2368,19 @@ static int editor_el_dx_boulderdash[] = EL_EMPTY, EL_EMPTY }; +static int num_editor_hl_dx_boulderdash = SIZEOF_ARRAY_INT(editor_hl_dx_boulderdash); static int num_editor_el_dx_boulderdash = SIZEOF_ARRAY_INT(editor_el_dx_boulderdash); -static int editor_el_chars[] = +static int editor_hl_chars[] = { EL_CHAR('T'), EL_CHAR('E'), EL_CHAR('X'), EL_CHAR('T'), +}; +static int editor_el_chars[] = +{ EL_CHAR(' '), EL_CHAR('!'), EL_CHAR('"'), @@ -2417,9 +2471,10 @@ static int editor_el_chars[] = EL_CHAR(FONT_ASCII_CURSOR), EL_CHAR(' ') }; +static int num_editor_hl_chars = SIZEOF_ARRAY_INT(editor_hl_chars); static int num_editor_el_chars = SIZEOF_ARRAY_INT(editor_el_chars); -static int editor_el_custom[] = +static int editor_hl_custom[] = { EL_CHAR('C'), EL_CHAR('U'), @@ -2440,7 +2495,10 @@ static int editor_el_custom[] = EL_CHAR('N'), EL_CHAR('T'), EL_CHAR('S'), +}; +static int editor_el_custom[] = +{ EL_CUSTOM_START + 0, EL_CUSTOM_START + 1, EL_CUSTOM_START + 2, @@ -2601,8 +2659,13 @@ static int editor_el_custom[] = EL_CUSTOM_START + 126, EL_CUSTOM_START + 127 }; +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[] = +{ +}; + static int editor_el_custom_more[] = { EL_CUSTOM_START + 128, @@ -2765,6 +2828,7 @@ static int editor_el_custom_more[] = EL_CUSTOM_START + 254, EL_CUSTOM_START + 255 }; +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); static int *editor_elements = NULL; /* dynamically allocated */ @@ -2773,6 +2837,10 @@ static int num_editor_elements = 0; /* dynamically determined */ static struct { boolean *setup_value; + + int *headline_list; + int *headline_list_size; + int *element_list; int *element_list_size; @@ -2780,28 +2848,61 @@ static struct } editor_elements_info[] = { - { &setup.editor.el_boulderdash, editor_el_boulderdash, - &num_editor_el_boulderdash }, - { &setup.editor.el_emerald_mine, editor_el_emerald_mine, - &num_editor_el_emerald_mine }, - { &setup.editor.el_more, editor_el_more, - &num_editor_el_more }, - { &setup.editor.el_sokoban, editor_el_sokoban, - &num_editor_el_sokoban }, - { &setup.editor.el_supaplex, editor_el_supaplex, - &num_editor_el_supaplex }, - { &setup.editor.el_diamond_caves, editor_el_diamond_caves, - &num_editor_el_diamond_caves }, - { &setup.editor.el_dx_boulderdash, editor_el_dx_boulderdash, - &num_editor_el_dx_boulderdash }, - { &setup.editor.el_chars, editor_el_chars, - &num_editor_el_chars }, - { &setup.editor.el_custom, editor_el_custom, - &num_editor_el_custom }, - { &setup.editor.el_custom_more, editor_el_custom_more, - &num_editor_el_custom_more }, - { NULL, NULL, - NULL } + { + &setup.editor.el_boulderdash, + editor_hl_boulderdash, &num_editor_hl_boulderdash, + editor_el_boulderdash, &num_editor_el_boulderdash + }, + { + &setup.editor.el_emerald_mine, + editor_hl_emerald_mine, &num_editor_hl_emerald_mine, + editor_el_emerald_mine, &num_editor_el_emerald_mine + }, + { + &setup.editor.el_more, + editor_hl_more, &num_editor_hl_more, + editor_el_more, &num_editor_el_more + }, + { + &setup.editor.el_sokoban, + editor_hl_sokoban, &num_editor_hl_sokoban, + editor_el_sokoban, &num_editor_el_sokoban + }, + { + &setup.editor.el_supaplex, + editor_hl_supaplex, &num_editor_hl_supaplex, + editor_el_supaplex, &num_editor_el_supaplex + }, + { + &setup.editor.el_diamond_caves, + editor_hl_diamond_caves, &num_editor_hl_diamond_caves, + editor_el_diamond_caves, &num_editor_el_diamond_caves + }, + { + &setup.editor.el_dx_boulderdash, + editor_hl_dx_boulderdash, &num_editor_hl_dx_boulderdash, + editor_el_dx_boulderdash, &num_editor_el_dx_boulderdash + }, + { + &setup.editor.el_chars, + editor_hl_chars, &num_editor_hl_chars, + editor_el_chars, &num_editor_el_chars + }, + { + &setup.editor.el_custom, + editor_hl_custom, &num_editor_hl_custom, + editor_el_custom, &num_editor_el_custom + }, + { + &setup.editor.el_custom_more, + editor_hl_custom_more, &num_editor_hl_custom_more, + editor_el_custom_more, &num_editor_el_custom_more + }, + { + NULL, + NULL, NULL, + NULL, NULL + } }; @@ -2811,20 +2912,94 @@ 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 */ for (i=0; editor_elements_info[i].setup_value != NULL; i++) + { if (*editor_elements_info[i].setup_value) + { + if (setup.editor.el_headlines) + num_editor_elements += *editor_elements_info[i].headline_list_size; + num_editor_elements += *editor_elements_info[i].element_list_size; + } + } if (num_editor_elements < ED_NUM_ELEMENTLIST_BUTTONS) { @@ -2839,9 +3014,17 @@ static void ReinitializeElementList() /* fill element list */ for (i=0; editor_elements_info[i].setup_value != NULL; i++) + { if (*editor_elements_info[i].setup_value) - for (j=0; j<*editor_elements_info[i].element_list_size; j++) + { + 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]; + + for (j=0; j < *editor_elements_info[i].element_list_size; j++) editor_elements[pos++] = editor_elements_info[i].element_list[j]; + } + } /* correct position of element list scrollbar */ if (element_shift < 0) @@ -2852,14 +3035,20 @@ static void ReinitializeElementList() static void ReinitializeElementListButtons() { + static boolean last_setup_value_headlines = FALSE; static boolean initialization_needed = TRUE; int i; if (!initialization_needed) /* check if editor element setup has changed */ + { + if (last_setup_value_headlines != setup.editor.el_headlines) + initialization_needed = TRUE; + for (i=0; editor_elements_info[i].setup_value != NULL; i++) if (editor_elements_info[i].last_setup_value != *editor_elements_info[i].setup_value) initialization_needed = TRUE; + } if (!initialization_needed) return; @@ -2868,6 +3057,7 @@ static void ReinitializeElementListButtons() CreateLevelEditorGadgets(); /* store current setup values for next invocation of this function */ + last_setup_value_headlines = setup.editor.el_headlines; for (i=0; editor_elements_info[i].setup_value != NULL; i++) editor_elements_info[i].last_setup_value = *editor_elements_info[i].setup_value; @@ -2875,56 +3065,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) { @@ -3181,7 +3321,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); } @@ -5228,7 +5376,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" }, @@ -5361,10 +5509,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 }, @@ -5380,8 +5535,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++) @@ -5433,13 +5588,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)) @@ -6555,7 +6717,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: