X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=04c6a46c074c195602a6f778cb0b15f1902c8e5a;hb=e4f31a4e6f4b611a1dddb16afb66e3af177dd937;hp=631a5756fa9584a3c4969fac84c8c39d82d03da1;hpb=6d7ebf6db8a9a57f2e3e398da1d2f7d8d084523f;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 631a5756..04c6a46c 100644 --- a/src/editor.c +++ b/src/editor.c @@ -547,22 +547,22 @@ #define GADGET_ID_RANDOM_PERCENTAGE (GADGET_ID_CHECKBUTTON_FIRST + 0) #define GADGET_ID_RANDOM_QUANTITY (GADGET_ID_CHECKBUTTON_FIRST + 1) #define GADGET_ID_RANDOM_RESTRICTED (GADGET_ID_CHECKBUTTON_FIRST + 2) -#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 3) -#define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 4) -#define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 5) -#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 6) -#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 7) -#define GADGET_ID_RANDOM_BALL_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 8) -#define GADGET_ID_INITIAL_BALL_STATE (GADGET_ID_CHECKBUTTON_FIRST + 9) -#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 10) -#define GADGET_ID_CONTINUOUS_SNAPPING (GADGET_ID_CHECKBUTTON_FIRST + 11) -#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12) -#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 13) -#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 14) -#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 15) -#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 16) -#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 18) +#define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 3) +#define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 4) +#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 5) +#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 6) +#define GADGET_ID_RANDOM_BALL_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 7) +#define GADGET_ID_INITIAL_BALL_STATE (GADGET_ID_CHECKBUTTON_FIRST + 8) +#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 9) +#define GADGET_ID_CONTINUOUS_SNAPPING (GADGET_ID_CHECKBUTTON_FIRST + 10) +#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 11) +#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12) +#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 13) +#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 14) +#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 15) +#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 16) +#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 17) +#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 18) #define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 19) #define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 20) #define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 21) @@ -771,23 +771,23 @@ #define ED_GRAPHICBUTTON_ID_CHANGE_LAST ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE /* values for checkbutton gadgets */ -#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 0 -#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 1 -#define ED_CHECKBUTTON_ID_STICK_ELEMENT 2 -#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 3 -#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 4 -#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 5 -#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 6 -#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 7 -#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 8 -#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 9 -#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 10 -#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 11 -#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 12 -#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 13 -#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 14 -#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 15 -#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 16 +#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 0 +#define ED_CHECKBUTTON_ID_STICK_ELEMENT 1 +#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 2 +#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 3 +#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 4 +#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 5 +#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 6 +#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 7 +#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 8 +#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 9 +#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 10 +#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 11 +#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 12 +#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 13 +#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 14 +#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 15 +#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 16 #define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 17 #define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 18 #define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 19 @@ -820,7 +820,7 @@ #define ED_NUM_CHECKBUTTONS 46 -#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_INITIAL_GRAVITY +#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC @@ -1026,7 +1026,7 @@ static struct NULL, " ", "height", }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(6), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(5), 0, 999, GADGET_ID_LEVEL_GEMSLIMIT_DOWN, GADGET_ID_LEVEL_GEMSLIMIT_UP, GADGET_ID_LEVEL_GEMSLIMIT_TEXT, GADGET_ID_NONE, @@ -1034,7 +1034,7 @@ static struct NULL, "number of gems to collect:", NULL }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(8), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(7), 0, 9999, GADGET_ID_LEVEL_TIMELIMIT_DOWN, GADGET_ID_LEVEL_TIMELIMIT_UP, GADGET_ID_LEVEL_TIMELIMIT_TEXT, GADGET_ID_NONE, @@ -1042,7 +1042,7 @@ static struct "time or step limit to solve level:", NULL, NULL }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(9), 0, 255, GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP, GADGET_ID_LEVEL_TIMESCORE_TEXT, GADGET_ID_NONE, @@ -1549,6 +1549,10 @@ static struct ValueTextInfo options_change_direct_action[] = #endif { CE_IMPACT, "impact (on something)" }, { CE_SMASHED, "smashed (from above)" }, +#if 0 + { CE_VALUE_CHANGES, "CE value changes" }, + { CE_SCORE_CHANGES, "CE score changes" }, +#endif { CE_VALUE_GETS_ZERO, "CE value gets 0" }, { CE_SCORE_GETS_ZERO, "CE score gets 0" }, @@ -1576,6 +1580,8 @@ static struct ValueTextInfo options_change_other_action[] = { CE_EXPLOSION_OF_X, "explosion of" }, { CE_MOVE_OF_X, "move of" }, { CE_CREATION_OF_X, "creation of" }, + { CE_VALUE_CHANGES_OF_X, "CE value changes of" }, + { CE_SCORE_CHANGES_OF_X, "CE score changes of" }, { CE_VALUE_GETS_ZERO_OF_X, "CE value gets 0 of" }, { CE_SCORE_GETS_ZERO_OF_X, "CE score gets 0 of" }, @@ -1667,7 +1673,6 @@ static struct ValueTextInfo options_action_type[] = { CA_SET_LEVEL_TIME, "set time" }, { CA_SET_LEVEL_SCORE, "set score" }, { CA_SET_LEVEL_GEMS, "set needed gems" }, - { CA_SET_LEVEL_GRAVITY, "set gravity" }, { CA_SET_LEVEL_WIND, "set wind dir." }, { CA_UNDEFINED, " " }, { CA_HEADLINE_PLAYER_ACTIONS, "[player actions]" }, @@ -1677,11 +1682,12 @@ static struct ValueTextInfo options_action_type[] = { CA_SET_PLAYER_KEYS, "set keys" }, { CA_SET_PLAYER_SPEED, "set speed" }, { CA_SET_PLAYER_SHIELD, "set shield" }, + { CA_SET_PLAYER_GRAVITY, "set gravity" }, { CA_SET_PLAYER_ARTWORK, "set artwork" }, { CA_UNDEFINED, " " }, { CA_HEADLINE_CE_ACTIONS, "[CE actions]" }, - { CA_SET_CE_SCORE, "set CE score" }, { CA_SET_CE_VALUE, "set CE value" }, + { CA_SET_CE_SCORE, "set CE score" }, { CA_UNDEFINED, " " }, { CA_HEADLINE_ENGINE_ACTIONS, "[engine actions]" }, { CA_SET_ENGINE_SCAN_MODE, "set scan mode" }, @@ -1691,7 +1697,7 @@ static struct ValueTextInfo options_action_type[] = static struct ValueTextInfo options_action_mode_none[] = { - { CA_ARG_UNDEFINED, " " }, + { CA_MODE_UNDEFINED, " " }, { -1, NULL } }; @@ -1761,9 +1767,9 @@ static struct ValueTextInfo options_action_arg_number[] = { CA_ARG_UNDEFINED, " " }, { CA_ARG_NUMBER_RESET, "reset" }, { CA_ARG_UNDEFINED, " " }, - { CA_ARG_NUMBER_CE_DELAY, "CE delay" }, - { CA_ARG_NUMBER_CE_SCORE, "CE score" }, { CA_ARG_NUMBER_CE_VALUE, "CE value" }, + { CA_ARG_NUMBER_CE_SCORE, "CE score" }, + { CA_ARG_NUMBER_CE_DELAY, "CE delay" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_NUMBER_LEVEL_TIME, "time" }, { CA_ARG_NUMBER_LEVEL_GEMS, "gems" }, @@ -1798,9 +1804,9 @@ static struct ValueTextInfo options_action_arg_value[] = { CA_ARG_UNDEFINED, " " }, { CA_ARG_NUMBER_RESET, "reset" }, { CA_ARG_UNDEFINED, " " }, - { CA_ARG_NUMBER_CE_DELAY, "CE delay" }, - { CA_ARG_NUMBER_CE_SCORE, "CE score" }, { CA_ARG_NUMBER_CE_VALUE, "CE value" }, + { CA_ARG_NUMBER_CE_SCORE, "CE score" }, + { CA_ARG_NUMBER_CE_DELAY, "CE delay" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_NUMBER_LEVEL_TIME, "time" }, { CA_ARG_NUMBER_LEVEL_GEMS, "gems" }, @@ -1970,14 +1976,14 @@ action_arg_options[] = { CA_SET_LEVEL_TIME, 3, options_action_arg_number, }, { CA_SET_LEVEL_GEMS, 3, options_action_arg_number, }, { CA_SET_LEVEL_SCORE, 3, options_action_arg_number, }, - { CA_SET_LEVEL_GRAVITY, 1, options_action_arg_gravity, }, { CA_SET_LEVEL_WIND, 1, options_action_arg_direction, }, { CA_SET_PLAYER_KEYS, 2, options_action_arg_key, }, { CA_SET_PLAYER_SPEED, 1, options_action_arg_speed, }, { CA_SET_PLAYER_SHIELD, 1, options_action_arg_shield, }, + { CA_SET_PLAYER_GRAVITY, 1, options_action_arg_gravity, }, { CA_SET_PLAYER_ARTWORK, 1, options_action_arg_artwork, }, - { CA_SET_CE_SCORE, 3, options_action_arg_value, }, { CA_SET_CE_VALUE, 3, options_action_arg_value, }, + { CA_SET_CE_SCORE, 3, options_action_arg_value, }, { CA_SET_ENGINE_SCAN_MODE, 1, options_action_arg_scan_mode, }, { -1, FALSE, NULL } @@ -1997,7 +2003,7 @@ static struct /* ---------- level and editor settings ---------------------------------- */ { - -1, ED_LEVEL_SETTINGS_YPOS(8), + -1, ED_LEVEL_SETTINGS_YPOS(7), GADGET_ID_TIME_OR_STEPS, GADGET_ID_LEVEL_TIMELIMIT_UP, -1, options_time_or_steps, @@ -2005,7 +2011,7 @@ static struct NULL, "(0 => no limit)", "time or step limit" }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(5), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(11), GADGET_ID_GAME_ENGINE_TYPE, GADGET_ID_NONE, -1, options_game_engine_type, @@ -2013,7 +2019,7 @@ static struct "game engine:", NULL, "game engine" }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(12), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10), GADGET_ID_WIND_DIRECTION, GADGET_ID_NONE, -1, options_wind_direction, @@ -2028,7 +2034,7 @@ static struct GADGET_ID_PLAYER_SPEED, GADGET_ID_NONE, -1, options_player_speed, - &level.initial_player_stepsize, + &level.initial_player_stepsize[0], "initial player speed:", NULL, "initial player speed" }, @@ -2396,6 +2402,8 @@ static struct int gd_x, gd_y; int x, y; int width, height; + int wheel_x, wheel_y; + int wheel_width, wheel_height; int type; int gadget_id; char *infotext; @@ -2405,6 +2413,8 @@ static struct ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS, SX + ED_SCROLL_HORIZONTAL_XPOS, SY + ED_SCROLL_HORIZONTAL_YPOS, ED_SCROLL_HORIZONTAL_XSIZE, ED_SCROLL_HORIZONTAL_YSIZE, + 0, 0, + SX + SXSIZE + SX, WIN_YSIZE, GD_TYPE_SCROLLBAR_HORIZONTAL, GADGET_ID_SCROLL_HORIZONTAL, "scroll level editing area horizontally" @@ -2413,6 +2423,8 @@ static struct ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS, SX + ED_SCROLL_VERTICAL_XPOS, SY + ED_SCROLL_VERTICAL_YPOS, ED_SCROLL_VERTICAL_XSIZE, ED_SCROLL_VERTICAL_YSIZE, + 0, 0, + SX + SXSIZE + SX, WIN_YSIZE, GD_TYPE_SCROLLBAR_VERTICAL, GADGET_ID_SCROLL_VERTICAL, "scroll level editing area vertically" @@ -2421,6 +2433,8 @@ static struct ED_SCROLLBAR2_XPOS, ED_SCROLLBAR2_YPOS, DX + ED_SCROLL2_VERTICAL_XPOS, DY + ED_SCROLL2_VERTICAL_YPOS, ED_SCROLL2_VERTICAL_XSIZE, ED_SCROLL2_VERTICAL_YSIZE, + SX + SXSIZE + SX, 0, + WIN_XSIZE - (SX + SXSIZE + SX), WIN_YSIZE, GD_TYPE_SCROLLBAR_VERTICAL, GADGET_ID_SCROLL_LIST_VERTICAL, "scroll element list vertically" @@ -2465,13 +2479,6 @@ static struct { /* ---------- level and editor settings ---------------------------------- */ - { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(11), - GADGET_ID_INITIAL_GRAVITY, GADGET_ID_NONE, - &level.initial_gravity, - NULL, - "initial gravity", "set initial level gravity" - }, { ED_LEVEL_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(9) - MINI_TILEY, GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_NONE, @@ -2587,6 +2594,13 @@ static struct NULL, "use explosion from element:", "use explosion properties from element" }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), + GADGET_ID_INITIAL_GRAVITY, GADGET_ID_NONE, + &level.initial_player_gravity[0], + NULL, + "use initial gravity", "set initial player gravity" + }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_CAN_PASS_TO_WALKABLE, GADGET_ID_NONE, @@ -2999,7 +3013,7 @@ static struct /* ---------- custom change content (extended change target) ------------- */ { - -1, ED_AREA_3X3_SETTINGS_YPOS(10), + -1, ED_AREA_3X3_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_CHANGE_CONTENT, GADGET_ID_NONE, /* align three rows */ &custom_element_change.target_content.e[0][0], 3, 3, NULL, NULL, NULL, "new extended elements after change" @@ -3105,6 +3119,16 @@ static int edit_mode_properties; static int element_shift = 0; +static int editor_el_players[] = +{ + EL_PLAYER_1, + EL_PLAYER_2, + EL_PLAYER_3, + EL_PLAYER_4 +}; +static int *editor_el_players_ptr = editor_el_players; +static int num_editor_el_players = SIZEOF_ARRAY_INT(editor_el_players); + static int editor_hl_boulderdash[] = { EL_INTERNAL_CASCADE_BD_ACTIVE, @@ -3132,6 +3156,34 @@ static int editor_hl_boulderdash[] = static int editor_el_boulderdash[] = { +#if 1 + EL_EMPTY, + EL_SAND, + EL_BD_ROCK, + EL_BD_DIAMOND, + + EL_STEELWALL, + EL_BD_WALL, + EL_BD_EXPANDABLE_WALL, + EL_BD_MAGIC_WALL, + + EL_BD_AMOEBA, + EL_BD_BUTTERFLY_UP, + EL_BD_FIREFLY_UP, + EL_EXIT_CLOSED, + + EL_BD_BUTTERFLY_LEFT, + EL_BD_FIREFLY_LEFT, + EL_BD_BUTTERFLY_RIGHT, + EL_BD_FIREFLY_RIGHT, + + EL_EMPTY, + EL_BD_BUTTERFLY_DOWN, + EL_BD_FIREFLY_DOWN, + EL_EXIT_OPEN, + +#else + EL_PLAYER_1, EL_EMPTY, EL_SAND, @@ -3155,7 +3207,8 @@ static int editor_el_boulderdash[] = EL_BD_AMOEBA, EL_BD_BUTTERFLY_DOWN, EL_BD_FIREFLY_DOWN, - EL_EMPTY, + EL_BD_EXPANDABLE_WALL, +#endif }; static int *editor_hl_boulderdash_ptr = editor_hl_boulderdash; static int *editor_el_boulderdash_ptr = editor_el_boulderdash; @@ -3189,13 +3242,71 @@ static int editor_hl_emerald_mine[] = static int editor_el_emerald_mine[] = { - EL_PLAYER_1, - EL_PLAYER_2, - EL_PLAYER_3, - EL_PLAYER_4, +#if 1 + EL_SAND, + EL_ROCK, + EL_QUICKSAND_EMPTY, + EL_QUICKSAND_FULL, + + EL_STEELWALL, + EL_WALL, + EL_WALL_SLIPPERY, + EL_MAGIC_WALL, + + EL_EMERALD, + EL_DIAMOND, + EL_NUT, + EL_BOMB, + + EL_WALL_EMERALD, + EL_WALL_DIAMOND, + EL_DYNAMITE, + EL_DYNAMITE_ACTIVE, + + EL_YAMYAM, + EL_BUG_UP, + EL_SPACESHIP_UP, + EL_ROBOT, + + EL_BUG_LEFT, + EL_SPACESHIP_LEFT, + EL_BUG_RIGHT, + EL_SPACESHIP_RIGHT, + + EL_ROBOT_WHEEL, + EL_BUG_DOWN, + EL_SPACESHIP_DOWN, + EL_INVISIBLE_WALL, + + EL_ACID_POOL_TOPLEFT, + EL_ACID, + EL_ACID_POOL_TOPRIGHT, + EL_AMOEBA_DROP, + + EL_ACID_POOL_BOTTOMLEFT, + EL_ACID_POOL_BOTTOM, + EL_ACID_POOL_BOTTOMRIGHT, + EL_AMOEBA_WET, + + EL_EM_KEY_1, + EL_EM_KEY_2, + EL_EM_KEY_3, + EL_EM_KEY_4, + + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + + EL_EM_GATE_1_GRAY, + EL_EM_GATE_2_GRAY, + EL_EM_GATE_3_GRAY, + EL_EM_GATE_4_GRAY, + +#else EL_PLAYER_1, - EL_EMPTY, + EL_PLAYER_2, EL_SAND, EL_ROCK, @@ -3263,6 +3374,7 @@ static int editor_el_emerald_mine[] = EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, +#endif }; static int *editor_hl_emerald_mine_ptr = editor_hl_emerald_mine; static int *editor_el_emerald_mine_ptr = editor_el_emerald_mine; @@ -3301,6 +3413,84 @@ static int editor_hl_emerald_mine_club[] = static int editor_el_emerald_mine_club[] = { +#if 1 + EL_EMC_KEY_5, + EL_EMC_KEY_6, + EL_EMC_KEY_7, + EL_EMC_KEY_8, + + EL_EMC_GATE_5, + EL_EMC_GATE_6, + EL_EMC_GATE_7, + EL_EMC_GATE_8, + + EL_EMC_GATE_5_GRAY, + EL_EMC_GATE_6_GRAY, + EL_EMC_GATE_7_GRAY, + EL_EMC_GATE_8_GRAY, + + EL_EMC_STEELWALL_1, + EL_EMC_STEELWALL_2, + EL_EMC_STEELWALL_3, + EL_EMC_STEELWALL_4, + + EL_EMC_WALL_13, + EL_EMC_WALL_14, + EL_EMC_WALL_15, + EL_EMC_WALL_16, + + EL_EMC_WALL_SLIPPERY_1, + EL_EMC_WALL_SLIPPERY_2, + EL_EMC_WALL_SLIPPERY_3, + EL_EMC_WALL_SLIPPERY_4, + + EL_EMC_WALL_1, + EL_EMC_WALL_2, + EL_EMC_WALL_3, + EL_EMC_WALL_4, + + EL_EMC_WALL_5, + EL_EMC_WALL_6, + EL_EMC_WALL_7, + EL_EMC_WALL_8, + + EL_EMC_WALL_9, + EL_EMC_WALL_10, + EL_EMC_WALL_11, + EL_EMC_WALL_12, + + EL_EMC_GRASS, + EL_EMC_FAKE_GRASS, + EL_EMC_PLANT, + EL_EMC_DRIPPER, + + EL_EMC_MAGIC_BALL, + EL_EMC_MAGIC_BALL_SWITCH, + EL_SPRING, + EL_EMC_SPRING_BUMPER, + + EL_EMC_LENSES, + EL_EMC_MAGNIFIER, + EL_EM_DYNAMITE, + EL_EM_DYNAMITE_ACTIVE, + + EL_BALLOON, + EL_YAMYAM_UP, + EL_BALLOON_SWITCH_UP, + EL_BALLOON_SWITCH_ANY, + + EL_YAMYAM_LEFT, + EL_BALLOON_SWITCH_LEFT, + EL_YAMYAM_RIGHT, + EL_BALLOON_SWITCH_RIGHT, + + EL_EMC_ANDROID, + EL_YAMYAM_DOWN, + EL_BALLOON_SWITCH_DOWN, + EL_BALLOON_SWITCH_NONE, + +#else + EL_EMC_KEY_5, EL_EMC_KEY_6, EL_EMC_KEY_7, @@ -3380,13 +3570,14 @@ static int editor_el_emerald_mine_club[] = EL_YAMYAM_RIGHT, EL_YAMYAM_UP, EL_YAMYAM_DOWN, +#endif }; static int *editor_hl_emerald_mine_club_ptr = editor_hl_emerald_mine_club; static int *editor_el_emerald_mine_club_ptr = editor_el_emerald_mine_club; static int num_editor_hl_emerald_mine_club=SIZEOF_ARRAY_INT(editor_hl_emerald_mine_club); static int num_editor_el_emerald_mine_club=SIZEOF_ARRAY_INT(editor_el_emerald_mine_club); -static int editor_hl_more[] = +static int editor_hl_rnd[] = { EL_INTERNAL_CASCADE_RND_ACTIVE, EL_CHAR('R'), @@ -3401,8 +3592,9 @@ static int editor_hl_more[] = #endif }; -static int editor_el_more[] = +static int editor_el_rnd[] = { +#if 1 EL_KEY_1, EL_KEY_2, EL_KEY_3, @@ -3423,7 +3615,94 @@ static int editor_el_more[] = EL_ARROW_UP, EL_ARROW_DOWN, + EL_AMOEBA_DEAD, + EL_AMOEBA_DRY, EL_AMOEBA_FULL, + EL_GAME_OF_LIFE, + + EL_EMERALD_YELLOW, + EL_EMERALD_RED, + EL_EMERALD_PURPLE, + EL_BIOMAZE, + + EL_WALL_EMERALD_YELLOW, + EL_WALL_EMERALD_RED, + EL_WALL_EMERALD_PURPLE, + EL_WALL_BD_DIAMOND, + + EL_SPEED_PILL, + EL_PACMAN_UP, + EL_TIME_ORB_FULL, + EL_TIME_ORB_EMPTY, + + EL_PACMAN_LEFT, + EL_DARK_YAMYAM, + EL_PACMAN_RIGHT, + EL_EMPTY, + + EL_BLACK_ORB, + EL_PACMAN_DOWN, + EL_LAMP, + EL_LAMP_ACTIVE, + + EL_DYNABOMB_INCREASE_NUMBER, + EL_DYNABOMB_INCREASE_SIZE, + EL_DYNABOMB_INCREASE_POWER, + EL_STONEBLOCK, + + EL_MOLE, + EL_PENGUIN, + EL_PIG, + EL_DRAGON, + + EL_BUG, + EL_MOLE_UP, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, + + EL_MOLE_LEFT, + EL_SATELLITE, + EL_MOLE_RIGHT, + EL_PACMAN, + + EL_SPACESHIP, + EL_MOLE_DOWN, + EL_INVISIBLE_STEELWALL, + EL_INVISIBLE_WALL, + + EL_EXPANDABLE_WALL, + EL_EXPANDABLE_WALL_HORIZONTAL, + EL_EXPANDABLE_WALL_VERTICAL, + EL_EXPANDABLE_WALL_ANY, + +#else + + EL_KEY_1, + EL_KEY_2, + EL_KEY_3, + EL_KEY_4, + + EL_GATE_1, + EL_GATE_2, + EL_GATE_3, + EL_GATE_4, + + EL_GATE_1_GRAY, + EL_GATE_2_GRAY, + EL_GATE_3_GRAY, + EL_GATE_4_GRAY, + + EL_ARROW_LEFT, + EL_ARROW_RIGHT, + EL_ARROW_UP, + EL_ARROW_DOWN, + + EL_AMOEBA_DEAD, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_EMPTY, + + EL_EMPTY, EL_EMERALD_YELLOW, EL_EMERALD_RED, EL_EMERALD_PURPLE, @@ -3482,11 +3761,12 @@ static int editor_el_more[] = EL_INVISIBLE_WALL, EL_SPEED_PILL, EL_BLACK_ORB, +#endif }; -static int *editor_hl_more_ptr = editor_hl_more; -static int *editor_el_more_ptr = editor_el_more; -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_hl_rnd_ptr = editor_hl_rnd; +static int *editor_el_rnd_ptr = editor_el_rnd; +static int num_editor_hl_rnd = SIZEOF_ARRAY_INT(editor_hl_rnd); +static int num_editor_el_rnd = SIZEOF_ARRAY_INT(editor_el_rnd); static int editor_hl_sokoban[] = { @@ -3520,28 +3800,81 @@ static int *editor_el_sokoban_ptr = editor_el_sokoban; 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_hl_supaplex[] = -{ - EL_INTERNAL_CASCADE_SP_ACTIVE, - EL_CHAR('S'), - EL_CHAR('P'), - EL_EMPTY, +static int editor_hl_supaplex[] = +{ + EL_INTERNAL_CASCADE_SP_ACTIVE, + EL_CHAR('S'), + EL_CHAR('P'), + EL_EMPTY, + +#if 0 + EL_CHAR('S'), + EL_CHAR('U'), + EL_CHAR('P'), + EL_CHAR('A'), + + EL_CHAR('P'), + EL_CHAR('L'), + EL_CHAR('E'), + EL_CHAR('X'), +#endif +}; + +static int editor_el_supaplex[] = +{ +#if 1 + EL_SP_MURPHY, + EL_EMPTY, + EL_SP_BASE, + EL_SP_BUGGY_BASE, + + EL_SP_INFOTRON, + EL_SP_ZONK, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON, + + EL_SP_DISK_RED, + EL_SP_DISK_ORANGE, + EL_SP_DISK_YELLOW, + EL_SP_TERMINAL, + + EL_SP_EXIT_CLOSED, + EL_SP_PORT_HORIZONTAL, + EL_SP_PORT_VERTICAL, + EL_SP_PORT_ANY, + + EL_SP_PORT_LEFT, + EL_SP_PORT_RIGHT, + EL_SP_PORT_UP, + EL_SP_PORT_DOWN, + + EL_SP_GRAVITY_PORT_LEFT, + EL_SP_GRAVITY_PORT_RIGHT, + EL_SP_GRAVITY_PORT_UP, + EL_SP_GRAVITY_PORT_DOWN, + + EL_SP_HARDWARE_GRAY, + EL_SP_HARDWARE_GREEN, + EL_SP_HARDWARE_BLUE, + EL_SP_HARDWARE_RED, -#if 0 - EL_CHAR('S'), - EL_CHAR('U'), - EL_CHAR('P'), - EL_CHAR('A'), + EL_SP_HARDWARE_BASE_1, + EL_SP_HARDWARE_BASE_2, + EL_SP_HARDWARE_BASE_3, + EL_SP_HARDWARE_BASE_4, - EL_CHAR('P'), - EL_CHAR('L'), - EL_CHAR('E'), - EL_CHAR('X'), -#endif -}; + EL_SP_HARDWARE_BASE_5, + EL_SP_HARDWARE_BASE_6, + EL_SP_HARDWARE_YELLOW, + EL_SP_CHIP_TOP, + + EL_SP_CHIP_SINGLE, + EL_SP_CHIP_LEFT, + EL_SP_CHIP_RIGHT, + EL_SP_CHIP_BOTTOM, + +#else -static int editor_el_supaplex[] = -{ #if 1 EL_EMPTY, #else @@ -3595,6 +3928,7 @@ static int editor_el_supaplex[] = EL_SP_HARDWARE_BASE_6, EL_SP_CHIP_TOP, EL_SP_CHIP_BOTTOM, +#endif }; static int *editor_hl_supaplex_ptr = editor_hl_supaplex; static int *editor_el_supaplex_ptr = editor_el_supaplex; @@ -3633,6 +3967,7 @@ static int editor_hl_diamond_caves[] = static int editor_el_diamond_caves[] = { +#if 1 EL_PEARL, EL_CRYSTAL, EL_WALL_PEARL, @@ -3668,9 +4003,29 @@ static int editor_el_diamond_caves[] = EL_CONVEYOR_BELT_3_SWITCH_RIGHT, EL_CONVEYOR_BELT_4_SWITCH_RIGHT, - EL_SWITCHGATE_OPEN, EL_SWITCHGATE_CLOSED, + EL_SWITCHGATE_OPEN, EL_SWITCHGATE_SWITCH_UP, + EL_SWITCHGATE_SWITCH_DOWN, + + EL_TIMEGATE_CLOSED, + EL_TIMEGATE_OPEN, + EL_TIMEGATE_SWITCH, + EL_EMPTY, + + EL_SIGN_EXCLAMATION, + EL_SIGN_STOP, + EL_LIGHT_SWITCH, + EL_LIGHT_SWITCH_ACTIVE, + + EL_STEELWALL_SLIPPERY, + EL_INVISIBLE_SAND, + EL_LANDMINE, + EL_EMPTY, + + EL_SHIELD_NORMAL, + EL_SHIELD_DEADLY, + EL_EXTRA_TIME, EL_EMPTY, EL_ENVELOPE_1, @@ -3678,6 +4033,53 @@ static int editor_el_diamond_caves[] = EL_ENVELOPE_3, EL_ENVELOPE_4, +#else + + EL_PEARL, + EL_CRYSTAL, + EL_WALL_PEARL, + EL_WALL_CRYSTAL, + + EL_CONVEYOR_BELT_1_LEFT, + EL_CONVEYOR_BELT_1_MIDDLE, + EL_CONVEYOR_BELT_1_RIGHT, + EL_CONVEYOR_BELT_1_SWITCH_MIDDLE, + + EL_CONVEYOR_BELT_2_LEFT, + EL_CONVEYOR_BELT_2_MIDDLE, + EL_CONVEYOR_BELT_2_RIGHT, + EL_CONVEYOR_BELT_2_SWITCH_MIDDLE, + + EL_CONVEYOR_BELT_3_LEFT, + EL_CONVEYOR_BELT_3_MIDDLE, + EL_CONVEYOR_BELT_3_RIGHT, + EL_CONVEYOR_BELT_3_SWITCH_MIDDLE, + + EL_CONVEYOR_BELT_4_LEFT, + EL_CONVEYOR_BELT_4_MIDDLE, + EL_CONVEYOR_BELT_4_RIGHT, + EL_CONVEYOR_BELT_4_SWITCH_MIDDLE, + + EL_CONVEYOR_BELT_1_SWITCH_LEFT, + EL_CONVEYOR_BELT_2_SWITCH_LEFT, + EL_CONVEYOR_BELT_3_SWITCH_LEFT, + EL_CONVEYOR_BELT_4_SWITCH_LEFT, + + EL_CONVEYOR_BELT_1_SWITCH_RIGHT, + EL_CONVEYOR_BELT_2_SWITCH_RIGHT, + EL_CONVEYOR_BELT_3_SWITCH_RIGHT, + EL_CONVEYOR_BELT_4_SWITCH_RIGHT, + + EL_SWITCHGATE_OPEN, + EL_SWITCHGATE_CLOSED, + EL_SWITCHGATE_SWITCH_UP, + EL_SWITCHGATE_SWITCH_DOWN, + + EL_ENVELOPE_1, + EL_ENVELOPE_2, + EL_ENVELOPE_3, + EL_ENVELOPE_4, + EL_TIMEGATE_CLOSED, EL_TIMEGATE_OPEN, EL_TIMEGATE_SWITCH, @@ -3697,6 +4099,8 @@ static int editor_el_diamond_caves[] = EL_SHIELD_DEADLY, EL_EXTRA_TIME, EL_EMPTY, + +#endif }; static int *editor_hl_diamond_caves_ptr = editor_hl_diamond_caves; static int *editor_el_diamond_caves_ptr = editor_el_diamond_caves; @@ -4222,17 +4626,7 @@ static int editor_el_custom[] = EL_CUSTOM_START + 252, EL_CUSTOM_START + 253, EL_CUSTOM_START + 254, - EL_CUSTOM_START + 255, - - EL_TRIGGER_PLAYER, - EL_TRIGGER_ELEMENT, - EL_TRIGGER_CE_VALUE, - EL_TRIGGER_CE_SCORE, - - EL_EMPTY, - EL_EMPTY, - EL_CURRENT_CE_VALUE, - EL_CURRENT_CE_SCORE + EL_CUSTOM_START + 255 }; static int *editor_hl_custom_ptr = editor_hl_custom; static int *editor_el_custom_ptr = editor_el_custom; @@ -4316,6 +4710,51 @@ static int *editor_el_group_ptr = editor_el_group; static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group); static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group); +static int editor_hl_reference[] = +{ + EL_INTERNAL_CASCADE_REF_ACTIVE, + EL_CHAR('R'), + EL_CHAR('E'), + EL_CHAR('F') +}; + +static int editor_el_reference[] = +{ + EL_TRIGGER_PLAYER, + EL_TRIGGER_ELEMENT, + EL_TRIGGER_CE_VALUE, + EL_TRIGGER_CE_SCORE, + + EL_SELF, + EL_ANY_ELEMENT, + EL_CURRENT_CE_VALUE, + EL_CURRENT_CE_SCORE, + + EL_LAST_CE_8, + EL_LAST_CE_7, + EL_LAST_CE_6, + EL_LAST_CE_5, + + EL_LAST_CE_4, + EL_LAST_CE_3, + EL_LAST_CE_2, + EL_LAST_CE_1, + + EL_NEXT_CE_1, + EL_NEXT_CE_2, + EL_NEXT_CE_3, + EL_NEXT_CE_4, + + EL_NEXT_CE_5, + EL_NEXT_CE_6, + EL_NEXT_CE_7, + EL_NEXT_CE_8, +}; +static int *editor_hl_reference_ptr = editor_hl_reference; +static int *editor_el_reference_ptr = editor_el_reference; +static int num_editor_hl_reference = SIZEOF_ARRAY_INT(editor_hl_reference); +static int num_editor_el_reference = SIZEOF_ARRAY_INT(editor_el_reference); + static int editor_hl_user_defined[] = { EL_INTERNAL_CASCADE_USER_ACTIVE, @@ -4372,6 +4811,13 @@ static boolean use_el_empty = FALSE; static int *editor_elements = NULL; /* dynamically allocated */ static int num_editor_elements = 0; /* dynamically determined */ +static boolean setup_editor_show_always = TRUE; +static boolean setup_editor_cascade_never = FALSE; + +static int editor_hl_unused[] = { EL_EMPTY }; +static int *editor_hl_unused_ptr = editor_hl_unused; +static int num_editor_hl_unused = 0; + static struct { boolean *setup_value; @@ -4387,6 +4833,12 @@ static struct } editor_elements_info[] = { + { + &setup_editor_show_always, + &setup_editor_cascade_never, + &editor_hl_unused_ptr, &num_editor_hl_unused, + &editor_el_players_ptr, &num_editor_el_players + }, { &setup.editor.el_boulderdash, &setup.editor_cascade.el_bd, @@ -4408,8 +4860,8 @@ editor_elements_info[] = { &setup.editor.el_more, &setup.editor_cascade.el_rnd, - &editor_hl_more_ptr, &num_editor_hl_more, - &editor_el_more_ptr, &num_editor_el_more + &editor_hl_rnd_ptr, &num_editor_hl_rnd, + &editor_el_rnd_ptr, &num_editor_el_rnd }, { &setup.editor.el_sokoban, @@ -4453,6 +4905,12 @@ editor_elements_info[] = &editor_hl_group_ptr, &num_editor_hl_group, &editor_el_group_ptr, &num_editor_el_group }, + { + &setup.editor.el_custom, + &setup.editor_cascade.el_ref, + &editor_hl_reference_ptr, &num_editor_hl_reference, + &editor_el_reference_ptr, &num_editor_el_reference + }, { &setup.editor.el_user_defined, &setup.editor_cascade.el_user, @@ -4536,6 +4994,32 @@ static char *getElementInfoText(int element) return info_text; } +char *getElementDescriptionFilename(int element) +{ + char *docs_dir = options.docs_directory; + char *elements_subdir = "elements"; + static char *filename = NULL; + char basename[MAX_FILENAME_LEN]; + + checked_free(filename); + + /* 1st try: look for element description file for exactly this element */ + sprintf(basename, "%s.txt", element_info[element].token_name); + filename = getPath3(docs_dir, elements_subdir, basename); + if (fileExists(filename)) + return filename; + + free(filename); + + /* 2nd try: look for element description file for this element's class */ + sprintf(basename, "%s.txt", element_info[element].class_name); + filename = getPath3(docs_dir, elements_subdir, basename); + if (fileExists(filename)) + return filename; + + return NULL; +} + static void InitDynamicEditorElementList(int **elements, int *num_elements) { boolean element_found[NUM_FILE_ELEMENTS]; @@ -5684,6 +6168,10 @@ static void CreateScrollbarGadgets() GDI_SCROLLBAR_ITEMS_MAX, items_max, GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible, GDI_SCROLLBAR_ITEM_POSITION, item_position, + GDI_WHEEL_AREA_X, scrollbar_info[i].wheel_x, + GDI_WHEEL_AREA_Y, scrollbar_info[i].wheel_y, + GDI_WHEEL_AREA_WIDTH, scrollbar_info[i].wheel_width, + GDI_WHEEL_AREA_HEIGHT, scrollbar_info[i].wheel_height, GDI_STATE, GD_BUTTON_UNPRESSED, GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1, GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2, @@ -6340,12 +6828,22 @@ static void setSelectboxSpecialActionVariablesIfNeeded() /* only change if corresponding selectbox has changed */ if (selectbox_info[ED_SELECTBOX_ID_ACTION_MODE].options != action_arg_modes[mode]) +#if 0 + custom_element_change.action_mode = + (action_arg_modes[mode])[0].value; +#else custom_element_change.action_mode = -1; +#endif /* only change if corresponding selectbox has changed */ if (selectbox_info[ED_SELECTBOX_ID_ACTION_ARG].options != action_arg_options[i].options) +#if 0 + custom_element_change.action_arg = + action_arg_options[i].options[0].value; +#else custom_element_change.action_arg = -1; +#endif break; } @@ -6377,6 +6875,18 @@ static void setSelectboxSpecialActionOptions() } } +#if 1 + +static void copy_custom_element_settings(int element_from, int element_to) +{ + struct ElementInfo *ei_from = &element_info[element_from]; + struct ElementInfo *ei_to = &element_info[element_to]; + + copyElementInfo(ei_from, ei_to); +} + +#else + static void copy_custom_element_settings(int element_from, int element_to) { struct ElementInfo *ei_from = &element_info[element_from]; @@ -6389,10 +6899,11 @@ static void copy_custom_element_settings(int element_from, int element_to) /* ---------- copy element base properties ---------- */ #if 1 - ei_to->properties[EP_BITFIELD_BASE] = ei_from->properties[EP_BITFIELD_BASE]; + ei_to->properties[EP_BITFIELD_BASE_NR] = + ei_from->properties[EP_BITFIELD_BASE_NR]; #else - Properties[element_to][EP_BITFIELD_BASE] = - Properties[element_from][EP_BITFIELD_BASE]; + Properties[element_to][EP_BITFIELD_BASE_NR] = + Properties[element_from][EP_BITFIELD_BASE_NR]; #endif /* ---------- copy custom property values ---------- */ @@ -6426,14 +6937,14 @@ static void copy_custom_element_settings(int element_from, int element_to) ei_to->slippery_type = ei_from->slippery_type; - for (y = 0; y < 3; y++) - for (x = 0; x < 3; x++) - ei_to->content.e[x][y] = ei_from->content.e[x][y]; - ei_to->explosion_type = ei_from->explosion_type; ei_to->explosion_delay = ei_from->explosion_delay; ei_to->ignition_delay = ei_from->ignition_delay; + for (y = 0; y < 3; y++) + for (x = 0; x < 3; x++) + ei_to->content.e[x][y] = ei_from->content.e[x][y]; + /* ---------- reinitialize and copy change pages ---------- */ ei_to->num_change_pages = ei_from->num_change_pages; @@ -6441,7 +6952,7 @@ static void copy_custom_element_settings(int element_from, int element_to) setElementChangePages(ei_to, ei_to->num_change_pages); - for (i=0; i < ei_to->num_change_pages; i++) + for (i = 0; i < ei_to->num_change_pages; i++) ei_to->change_page[i] = ei_from->change_page[i]; /* ---------- copy group element info ---------- */ @@ -6451,6 +6962,7 @@ static void copy_custom_element_settings(int element_from, int element_to) /* mark this custom element as modified */ ei_to->modified_settings = TRUE; } +#endif static void replace_custom_element_in_settings(int element_from, int element_to) @@ -6676,6 +7188,8 @@ static void CopyCustomElementPropertiesToEditor(int element) HAS_CHANGE_EVENT(element, CE_BLOCKED) ? CE_BLOCKED : HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT : HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED : + HAS_CHANGE_EVENT(element, CE_VALUE_CHANGES) ? CE_VALUE_CHANGES : + HAS_CHANGE_EVENT(element, CE_SCORE_CHANGES) ? CE_SCORE_CHANGES : HAS_CHANGE_EVENT(element, CE_VALUE_GETS_ZERO) ? CE_VALUE_GETS_ZERO : HAS_CHANGE_EVENT(element, CE_SCORE_GETS_ZERO) ? CE_SCORE_GETS_ZERO : custom_element_change.direct_action); @@ -6701,6 +7215,8 @@ static void CopyCustomElementPropertiesToEditor(int element) HAS_CHANGE_EVENT(element, CE_EXPLOSION_OF_X) ? CE_EXPLOSION_OF_X : HAS_CHANGE_EVENT(element, CE_MOVE_OF_X) ? CE_MOVE_OF_X : HAS_CHANGE_EVENT(element, CE_CREATION_OF_X) ? CE_CREATION_OF_X : + HAS_CHANGE_EVENT(element, CE_VALUE_CHANGES_OF_X) ? CE_VALUE_CHANGES_OF_X : + HAS_CHANGE_EVENT(element, CE_SCORE_CHANGES_OF_X) ? CE_SCORE_CHANGES_OF_X : HAS_CHANGE_EVENT(element, CE_VALUE_GETS_ZERO_OF_X) ? CE_VALUE_GETS_ZERO_OF_X : HAS_CHANGE_EVENT(element, CE_SCORE_GETS_ZERO_OF_X) ? CE_SCORE_GETS_ZERO_OF_X : custom_element_change.other_action); @@ -6819,6 +7335,8 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_change_events[CE_BLOCKED] = FALSE; custom_element_change_events[CE_IMPACT] = FALSE; custom_element_change_events[CE_SMASHED] = FALSE; + custom_element_change_events[CE_VALUE_CHANGES] = FALSE; + custom_element_change_events[CE_SCORE_CHANGES] = FALSE; custom_element_change_events[CE_VALUE_GETS_ZERO] = FALSE; custom_element_change_events[CE_SCORE_GETS_ZERO] = FALSE; custom_element_change_events[custom_element_change.direct_action] = @@ -6844,6 +7362,8 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_change_events[CE_EXPLOSION_OF_X] = FALSE; custom_element_change_events[CE_MOVE_OF_X] = FALSE; custom_element_change_events[CE_CREATION_OF_X] = FALSE; + custom_element_change_events[CE_VALUE_CHANGES_OF_X] = FALSE; + custom_element_change_events[CE_SCORE_CHANGES_OF_X] = FALSE; custom_element_change_events[CE_VALUE_GETS_ZERO_OF_X] = FALSE; custom_element_change_events[CE_SCORE_GETS_ZERO_OF_X] = FALSE; custom_element_change_events[custom_element_change.other_action] = @@ -6891,11 +7411,24 @@ static void CopyElementPropertiesToGame(int element) CopyClassicElementPropertiesToGame(element); } +void CheckElementDescriptions() +{ + int i; + + for (i = 0; i < NUM_FILE_ELEMENTS; i++) + if (getElementDescriptionFilename(i) == NULL && !IS_OBSOLETE(i)) + Error(ERR_WARN, "no element description for element '%s'", EL_NAME(i)); +} + void DrawLevelEd() { CloseDoor(DOOR_CLOSE_ALL); OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY); +#if DEBUG + CheckElementDescriptions(); +#endif + if (level_editor_test_game) { CopyPlayfield(level.field, Feld); @@ -7410,7 +7943,7 @@ static void DrawEnvelopeTextArea(int envelope_nr) DrawBackground(gi->x, gi->y, gi->width, gi->height); if (envelope_nr != -1) - textarea_info[id].value = level.envelope_text[envelope_nr]; + textarea_info[id].value = level.envelope[envelope_nr].text; ModifyGadget(gi, GDI_AREA_SIZE, *counterbutton_info[ED_COUNTER_ID_ENVELOPE_XSIZE].value, @@ -7420,32 +7953,6 @@ static void DrawEnvelopeTextArea(int envelope_nr) MapTextAreaGadget(ED_TEXTAREA_ID_ENVELOPE_INFO); } -char *getElementDescriptionFilename(int element) -{ - char *docs_dir = options.docs_directory; - char *elements_subdir = "elements"; - static char *filename = NULL; - char basename[MAX_FILENAME_LEN]; - - checked_free(filename); - - /* 1st try: look for element description file for exactly this element */ - sprintf(basename, "%s.txt", element_info[element].token_name); - filename = getPath3(docs_dir, elements_subdir, basename); - if (fileExists(filename)) - return filename; - - free(filename); - - /* 2nd try: look for element description file for this element's class */ - sprintf(basename, "%s.txt", element_info[element].class_name); - filename = getPath3(docs_dir, elements_subdir, basename); - if (fileExists(filename)) - return filename; - - return NULL; -} - static boolean PrintInfoText(char *text, int font_nr, int start_line) { int font_height = getFontHeight(font_nr); @@ -7765,6 +8272,7 @@ static struct #if 1 { EL_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION }, + { EL_LIGHT_SWITCH, &level.time_light, TEXT_DURATION }, { EL_LIGHT_SWITCH_ACTIVE, &level.time_light, TEXT_DURATION }, { EL_SHIELD_NORMAL, &level.shield_normal_time, TEXT_DURATION }, { EL_SHIELD_DEADLY, &level.shield_deadly_time, TEXT_DURATION }, @@ -7898,6 +8406,7 @@ static void DrawPropertiesConfig() int player_nr = GET_PLAYER_NR(properties_element); /* these properties can be set for every player individually */ + drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value = &level.start_element[player_nr]; drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value = @@ -7905,13 +8414,17 @@ static void DrawPropertiesConfig() drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value = &level.explosion_element[player_nr]; - /* these properties can be set for every player individually */ checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value = &level.use_start_element[player_nr]; checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value = &level.use_artwork_element[player_nr]; checkbutton_info[ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT].value = &level.use_explosion_element[player_nr]; + checkbutton_info[ED_CHECKBUTTON_ID_INITIAL_GRAVITY].value = + &level.initial_player_gravity[player_nr]; + + selectbox_info[ED_SELECTBOX_ID_PLAYER_SPEED].value = + &level.initial_player_stepsize[player_nr]; MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID); MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ? @@ -7923,6 +8436,7 @@ static void DrawPropertiesConfig() MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_GRAVITY); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE); MapDrawingArea(ED_DRAWING_ID_START_ELEMENT); @@ -7978,8 +8492,8 @@ static void DrawPropertiesConfig() 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]; + counterbutton_info[counter1_id].value = &level.envelope[envelope_nr].xsize; + counterbutton_info[counter2_id].value = &level.envelope[envelope_nr].ysize; /* display counter to choose size of envelope text area */ MapCounterButtons(ED_COUNTER_ID_ENVELOPE_XSIZE); @@ -8800,11 +9314,20 @@ static void SetTextCursor(int unused_sx, int unused_sy, int sx, int sy, DrawAreaBorder(sx, sy, sx, sy); } +static void CheckLevelBorderElement(boolean redraw_playfield) +{ + int last_border_element = BorderElement; + + SetBorderElement(); + + if (redraw_playfield && BorderElement != last_border_element) + DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); +} + static void CopyLevelToUndoBuffer(int mode) { static boolean accumulated_undo = FALSE; boolean new_undo_buffer_position = TRUE; - int last_border_element; int x, y; switch (mode) @@ -8837,10 +9360,7 @@ static void CopyLevelToUndoBuffer(int mode) UndoBuffer[undo_buffer_position][x][y] = Feld[x][y]; /* check if drawing operation forces change of border style */ - last_border_element = BorderElement; - SetBorderElement(); - if (BorderElement != last_border_element) - DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); + CheckLevelBorderElement(TRUE); level.changed = TRUE; } @@ -9726,7 +10246,12 @@ static void HandleControlButtons(struct GadgetInfo *gi) for (x = 0; x < lev_fieldx; x++) for (y = 0; y < lev_fieldy; y++) Feld[x][y] = UndoBuffer[undo_buffer_position][x][y]; - DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos,level_ypos); + + /* check if undo operation forces change of border style */ + CheckLevelBorderElement(FALSE); + + DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); + break; case GADGET_ID_INFO: @@ -9920,7 +10445,9 @@ void HandleLevelEditorKeyInput(Key key) } else if (button_status == MB_RELEASED) { - int i, id = GADGET_ID_NONE; + int id = GADGET_ID_NONE; + int new_element_shift = element_shift; + int i; switch (key) { @@ -9960,32 +10487,34 @@ void HandleLevelEditorKeyInput(Key key) case KSYM_Insert: case KSYM_Delete: + + /* this is needed to prevent interference with running "True X-Mouse" */ + if (GetKeyModStateFromEvents() & KMOD_Control) + break; + + /* check for last or next editor cascade block in element list */ for (i = 0; i < num_editor_elements; i++) { - int e = editor_elements[i]; - - if ((key == KSYM_Insert && - (e == EL_INTERNAL_CASCADE_CE || - e == EL_INTERNAL_CASCADE_CE_ACTIVE)) || - (key == KSYM_Delete && - (e == EL_INTERNAL_CASCADE_GE || - e == EL_INTERNAL_CASCADE_GE_ACTIVE))) + if ((key == KSYM_Insert && i == element_shift) || + (key == KSYM_Delete && new_element_shift > element_shift)) break; + + /* jump to next cascade block (or to start of element list) */ + if (i == 0 || IS_EDITOR_CASCADE(editor_elements[i])) + new_element_shift = i; } if (i < num_editor_elements) - { - element_shift = i; + element_shift = new_element_shift; - if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS) - element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS; + if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS) + element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS; - ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL], - GDI_SCROLLBAR_ITEM_POSITION, - element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END); + ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL], + GDI_SCROLLBAR_ITEM_POSITION, + element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END); - ModifyEditorElementList(); - } + ModifyEditorElementList(); break; @@ -10007,6 +10536,7 @@ void HandleLevelEditorKeyInput(Key key) DrawDrawingWindow(); edit_mode = ED_MODE_DRAWING; } + break; default: