X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=8c68e5c1bb9353a11cb33be00534b0eb6d7c519d;hb=dce12aedb7f597d85daf4ae5dfc4e058ae2f7b5c;hp=988c1cdccc22da4b438a1b2093b4af669e9a07e2;hpb=983b7bc7f3493b1522d08d8e7bdecb3bd8e462eb;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 988c1cdc..8c68e5c1 100644 --- a/src/editor.c +++ b/src/editor.c @@ -474,11 +474,14 @@ #define GADGET_ID_CHANGE_PLAYER (GADGET_ID_SELECTBOX_FIRST + 19) #define GADGET_ID_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 20) #define GADGET_ID_CHANGE_REPLACE_WHEN (GADGET_ID_SELECTBOX_FIRST + 21) -#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 22) -#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 23) +#define GADGET_ID_ACTION_TYPE (GADGET_ID_SELECTBOX_FIRST + 22) +#define GADGET_ID_ACTION_MODE (GADGET_ID_SELECTBOX_FIRST + 23) +#define GADGET_ID_ACTION_ARG (GADGET_ID_SELECTBOX_FIRST + 24) +#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 25) +#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 26) /* textbutton identifiers */ -#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 24) +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 27) #define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) #define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) @@ -553,12 +556,13 @@ #define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 33) #define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 34) #define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 35) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 36) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 37) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 38) +#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 36) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 37) +#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 38) +#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 39) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 39) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 40) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -676,10 +680,13 @@ #define ED_SELECTBOX_ID_CHANGE_PLAYER 19 #define ED_SELECTBOX_ID_CHANGE_PAGE 20 #define ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN 21 -#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 22 -#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 23 +#define ED_SELECTBOX_ID_ACTION_TYPE 22 +#define ED_SELECTBOX_ID_ACTION_MODE 23 +#define ED_SELECTBOX_ID_ACTION_ARG 24 +#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 25 +#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 26 -#define ED_NUM_SELECTBOX 24 +#define ED_NUM_SELECTBOX 27 #define ED_SELECTBOX_ID_LEVEL_FIRST ED_SELECTBOX_ID_TIME_OR_STEPS #define ED_SELECTBOX_ID_LEVEL_LAST ED_SELECTBOX_ID_GAME_ENGINE_TYPE @@ -761,8 +768,9 @@ #define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 34 #define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 35 #define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 36 +#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 37 -#define ED_NUM_CHECKBUTTONS 37 +#define ED_NUM_CHECKBUTTONS 38 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_INITIAL_GRAVITY #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED @@ -775,7 +783,7 @@ #define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM2_LAST #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE -#define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM +#define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION /* values for radiobutton gadgets */ #define ED_RADIOBUTTON_ID_PERCENTAGE 0 @@ -856,7 +864,7 @@ /* values for elements with count for collecting */ #define MIN_COLLECT_COUNT 0 -#define MAX_COLLECT_COUNT 100 +#define MAX_COLLECT_COUNT 255 /* values for random placement */ #define RANDOM_USE_PERCENTAGE 0 @@ -879,6 +887,9 @@ static struct char *text; } control_info[ED_NUM_CTRL_BUTTONS] = { + /* note: some additional characters are already reserved for "cheat mode" + shortcuts (":XYZ" style) -- for details, see "events.c" */ + { 's', "draw single items" }, { 'd', "draw connected items" }, { 'l', "draw lines" }, @@ -1045,7 +1056,7 @@ static struct MIN_SCORE, MAX_SCORE, GADGET_ID_CUSTOM_SCORE_DOWN, GADGET_ID_CUSTOM_SCORE_UP, GADGET_ID_CUSTOM_SCORE_TEXT, GADGET_ID_NONE, - &custom_element.collect_score, + &custom_element.collect_score_initial, NULL, "score", " " }, { @@ -1053,7 +1064,7 @@ static struct MIN_COLLECT_COUNT, MAX_COLLECT_COUNT, GADGET_ID_CUSTOM_GEMCOUNT_DOWN, GADGET_ID_CUSTOM_GEMCOUNT_UP, GADGET_ID_CUSTOM_GEMCOUNT_TEXT, GADGET_ID_CUSTOM_SCORE_UP, - &custom_element.collect_count, + &custom_element.collect_count_initial, NULL, "count", NULL }, { @@ -1256,6 +1267,7 @@ static struct ValueTextInfo options_access_protected[] = static struct ValueTextInfo options_access_direction[] = { + { MV_NO_DIRECTIONS, "no direction" }, { MV_LEFT, "left" }, { MV_RIGHT, "right" }, { MV_UP, "up" }, @@ -1333,9 +1345,7 @@ static struct ValueTextInfo options_move_stepsize[] = { 4, "normal" }, { 8, "fast" }, { 16, "very fast" }, -#if 1 { 32, "even faster" }, -#endif { -1, NULL } }; @@ -1384,9 +1394,6 @@ static struct ValueTextInfo options_explosion_type[] = { EXPLODES_3X3, "3x3" }, { EXPLODES_CROSS, "3+3" }, { EXPLODES_1X1, "1x1" }, -#if 0 - { EP_INDESTRUCTIBLE, "indestructible" }, -#endif { -1, NULL } }; @@ -1408,41 +1415,35 @@ static struct ValueTextInfo options_change_direct_action[] = { CE_LEFT_BY_PLAYER, "left by player" }, { CE_DROPPED_BY_PLAYER, "dropped/thrown by player" }, { CE_SWITCHED, "switched" }, -#if 1 { CE_HITTING_SOMETHING, "hitting something" }, { CE_HIT_BY_SOMETHING, "hit by something" }, -#else - { CE_HITTING_SOMETHING, "collision" }, -#endif - #if 0 { CE_BLOCKED, "blocked" }, #endif - { CE_IMPACT, "impact (on something)" }, { CE_SMASHED, "smashed (from above)" }, + { CE_COUNT_AT_ZERO, "CE count at zero" }, { -1, NULL } }; static struct ValueTextInfo options_change_other_action[] = { - { 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/throws" }, - { CE_OTHER_IS_TOUCHING, "touching" }, -#if 1 - { CE_OTHER_IS_HITTING, "hitting" }, - { CE_OTHER_GETS_HIT, "hit by" }, -#endif - { CE_OTHER_IS_SWITCHING, "switch of" }, - { CE_OTHER_IS_CHANGING, "change by page of" }, - { CE_OTHER_IS_EXPLODING, "explosion of" }, + { CE_PLAYER_TOUCHES_X, "player touches" }, + { CE_PLAYER_PRESSES_X, "player presses" }, + { CE_PLAYER_PUSHES_X, "player pushes" }, + { CE_PLAYER_ENTERS_X, "player enters" }, + { CE_PLAYER_LEAVES_X, "player leaves" }, + { CE_PLAYER_DIGS_X, "player digs" }, + { CE_PLAYER_COLLECTS_X, "player collects" }, + { CE_PLAYER_DROPS_X, "player drops/throws" }, + { CE_TOUCHING_X, "touching" }, + { CE_HITTING_X, "hitting" }, + { CE_HIT_BY_X, "hit by" }, + { CE_SWITCH_OF_X, "switch of" }, + { CE_CHANGE_OF_X, "change by page of" }, + { CE_EXPLOSION_OF_X, "explosion of" }, + { CE_COUNT_AT_ZERO_OF_X, "CE count at zero of" }, { -1, NULL } }; @@ -1522,6 +1523,82 @@ static struct ValueTextInfo options_change_replace_when[] = { -1, NULL } }; +static struct ValueTextInfo options_action_type[] = +{ + { CA_NO_ACTION, "no action" }, + { CA_EXIT_PLAYER, "exit player" }, + { CA_KILL_PLAYER, "kill player" }, + { CA_RESTART_LEVEL, "restart level" }, + { CA_SHOW_ENVELOPE, "show envelope" }, + { CA_ADD_KEY, "add key" }, + { CA_DEL_KEY, "remove key" }, + { CA_SET_PLAYER_SPEED, "set player speed" }, + { CA_SET_GEMS, "set gems" }, + { CA_SET_TIME, "set time" }, + { CA_SET_SCORE, "set score" }, + { CA_SET_CE_SCORE, "set CE score" }, + { CA_SET_CE_COUNT, "set CE count" }, +#if 0 + { CA_SET_DYNABOMB_NUMBER, "set bomb number" }, + { CA_SET_DYNABOMB_SIZE, "set bomb size" }, + { CA_SET_DYNABOMB_POWER, "set bomb power" }, +#endif + { CA_TOGGLE_PLAYER_GRAVITY, "toggle gravity" }, + { CA_ENABLE_PLAYER_GRAVITY, "enable gravity" }, + { CA_DISABLE_PLAYER_GRAVITY, "disable gravity" }, + + { -1, NULL } +}; + +static struct ValueTextInfo options_action_mode[] = +{ + { CA_MODE_UNDEFINED, " " }, + { CA_MODE_SET, "=" }, + { CA_MODE_ADD, "+" }, + { CA_MODE_SUBTRACT, "-" }, + { CA_MODE_MULTIPLY, "*" }, + { CA_MODE_DIVIDE, "/" }, + { CA_MODE_MODULO, "%" }, + + { -1, NULL } +}; + +static struct ValueTextInfo options_action_arg[] = +{ + { CA_ARG_PLAYER_HEADLINE, "[player]" }, + { CA_ARG_PLAYER_1, "1" }, + { CA_ARG_PLAYER_2, "2" }, + { CA_ARG_PLAYER_3, "3" }, + { CA_ARG_PLAYER_4, "4" }, + { CA_ARG_PLAYER_ANY, "any" }, + { CA_ARG_PLAYER_TRIGGER, "trigger" }, + { CA_ARG_UNDEFINED, " " }, + { CA_ARG_NUMBER_HEADLINE, "[number]" }, + { CA_ARG_0, "0" }, + { CA_ARG_1, "1" }, + { CA_ARG_2, "2" }, + { CA_ARG_3, "3" }, + { CA_ARG_4, "4" }, + { CA_ARG_5, "5" }, + { CA_ARG_10, "10" }, + { CA_ARG_100, "100" }, + { CA_ARG_1000, "1000" }, + { CA_ARG_UNDEFINED, " " }, + { CA_ARG_NUMBER_MIN, "min" }, + { CA_ARG_NUMBER_MAX, "max" }, + { CA_ARG_NUMBER_NORMAL, "normal" }, + { CA_ARG_NUMBER_RESET, "reset" }, + { CA_ARG_NUMBER_CE_SCORE, "CE score" }, + { CA_ARG_NUMBER_CE_COUNT, "CE count" }, + { CA_ARG_NUMBER_CE_DELAY, "CE delay" }, + { CA_ARG_UNDEFINED, " " }, + { CA_ARG_ELEMENT_HEADLINE, "[element]" }, + { CA_ARG_ELEMENT_TARGET, "target" }, + { CA_ARG_ELEMENT_TRIGGER, "trigger" }, + + { -1, NULL } +}; + static char options_change_page_strings[MAX_CHANGE_PAGES][10]; static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] = { @@ -1737,6 +1814,30 @@ static struct &custom_element_change.replace_when, "replace when", NULL, "which elements can be replaced" }, + { + ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13), + GADGET_ID_ACTION_TYPE, GADGET_ID_NONE, + -1, + options_action_type, + &custom_element_change.action_type, + NULL, NULL, "action on specified condition" + }, + { + -1, ED_ELEMENT_SETTINGS_YPOS(13), + GADGET_ID_ACTION_MODE, GADGET_ID_ACTION_TYPE, + -1, + options_action_mode, + &custom_element_change.action_mode, + NULL, NULL, "action operator" + }, + { + -1, ED_ELEMENT_SETTINGS_YPOS(13), + GADGET_ID_ACTION_ARG, GADGET_ID_ACTION_MODE, + -1, + options_action_arg, + &custom_element_change.action_arg, + NULL, NULL, "action parameter" + }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_SELECT_CHANGE_PAGE, GADGET_ID_NONE, @@ -1768,7 +1869,6 @@ static struct char *text_left, *text_right, *infotext; } textbutton_info[ED_NUM_TEXTBUTTONS] = { -#if 1 { ED_ELEMENT_SETTINGS_XPOS(0), ED_COUNTER_YPOS(1), GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE, @@ -1799,26 +1899,6 @@ static struct 8, "Change", NULL, NULL, "Custom element change configuration" }, -#else - { - ED_ELEMENT_SETTINGS_XPOS(0), ED_COUNTER_YPOS(1), - GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE, - 11, "Information", - NULL, NULL, "Show information about element" - }, - { - ED_ELEMENT_SETTINGS_XPOS(0) + 166, ED_COUNTER_YPOS(1), - GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_NONE, - 11, "Configure", - NULL, NULL, "Configure element properties" - }, - { - ED_ELEMENT_SETTINGS_XPOS(0) + 332, ED_COUNTER_YPOS(1), - GADGET_ID_PROPERTIES_CHANGE, GADGET_ID_NONE, - 11, "Advanced", - NULL, NULL, "Advanced element configuration" - }, -#endif { -1, ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_SAVE_AS_TEMPLATE, GADGET_ID_CUSTOM_USE_TEMPLATE, @@ -2209,7 +2289,7 @@ static struct ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_CAN_CHANGE, GADGET_ID_NONE, &custom_element_change.can_change, - NULL, "element changes to:", "element can change to other element" + NULL, "element changes to:", "change element on specified condition" }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2), @@ -2253,6 +2333,12 @@ static struct &custom_element_change.use_random_replace, NULL, NULL, "use percentage for random replace" }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13), + GADGET_ID_CHANGE_HAS_ACTION, GADGET_ID_NONE, + &custom_element_change.has_action, + NULL, NULL, "execute action on specified condition" + }, }; static struct @@ -2489,6 +2575,7 @@ static int new_element1 = EL_WALL; static int new_element2 = EL_EMPTY; static int new_element3 = EL_SAND; +#define IS_VALID_BUTTON(button) (button >= 1 && button <= 3) #define BUTTON_ELEMENT(button) ((button) == 1 ? new_element1 : \ (button) == 2 ? new_element2 : \ (button) == 3 ? new_element3 : EL_EMPTY) @@ -2667,17 +2754,10 @@ 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, @@ -2764,10 +2844,18 @@ static int editor_el_emerald_mine_club[] = EL_EMC_WALL_11, EL_EMC_WALL_12, +#if RELEASE_3_1_2 + EL_EMPTY, +#else EL_EMC_ANDROID, +#endif EL_BALLOON, EL_BALLOON_SWITCH_ANY, +#if RELEASE_3_1_2 + EL_EMPTY, +#else EL_BALLOON_SWITCH_NONE, +#endif EL_BALLOON_SWITCH_LEFT, EL_BALLOON_SWITCH_RIGHT, @@ -2776,15 +2864,33 @@ static int editor_el_emerald_mine_club[] = EL_EMC_GRASS, EL_EMC_PLANT, +#if RELEASE_3_1_2 + EL_EMPTY, + EL_EMPTY, +#else EL_EMC_LENSES, EL_EMC_MAGNIFIER, +#endif +#if RELEASE_3_1_2 + EL_EMPTY, + EL_EMPTY, +#else EL_EMC_MAGIC_BALL, EL_EMC_MAGIC_BALL_SWITCH, +#endif EL_SPRING, +#if RELEASE_3_1_2 + EL_EMPTY, +#else EL_EMC_SPRING_BUMPER, +#endif +#if RELEASE_3_1_2 + EL_EMPTY, +#else EL_EMC_DRIPPER, +#endif EL_EMC_FAKE_GRASS, EL_EMPTY, EL_EMPTY, @@ -3833,209 +3939,6 @@ editor_elements_info[] = } }; -#if 0 - -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 } -}; - -#endif - /* ----------------------------------------------------------------------------- @@ -4091,42 +3994,32 @@ static char *getElementInfoText(int element) static void ReinitializeElementList() { - static boolean initialized = FALSE; int pos = 0; int i, j; checked_free(editor_elements); -#if 0 - if (!initialized) -#else - /* reload user defined element list for each invocation of level editor */ -#endif - { - /* initialize optional user defined element list */ - LoadUserDefinedEditorElementList(&editor_el_user_defined_ptr, - &num_editor_el_user_defined); + /* reload optional user defined element list for each invocation of editor */ + LoadUserDefinedEditorElementList(&editor_el_user_defined_ptr, + &num_editor_el_user_defined); - /* initialize list of empty elements (used for padding, if needed) */ - for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++) - editor_el_empty[i] = EL_EMPTY; + /* initialize list of empty elements (used for padding, if needed) */ + for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++) + editor_el_empty[i] = EL_EMPTY; - /* do some sanity checks for each element from element list */ - for (i = 0; editor_elements_info[i].setup_value != NULL; i++) + /* do some sanity checks for each element from element list */ + for (i = 0; editor_elements_info[i].setup_value != NULL; i++) + { + for (j = 0; j < *editor_elements_info[i].element_list_size; j++) { - for (j = 0; j < *editor_elements_info[i].element_list_size; j++) - { - int element = (*editor_elements_info[i].element_list)[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 (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); - } + if (strcmp(getElementInfoText(element), INFOTEXT_UNKNOWN_ELEMENT) == 0) + Error(ERR_WARN, "no element description for element %d", element); } - - initialized = TRUE; } num_editor_elements = 0; @@ -4277,7 +4170,7 @@ static void DrawDrawingArea(int id) for (x = 0; x < 3; x++) DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, - el2edimg(custom_element.content[x][y])); + el2edimg(custom_element.content.e[x][y])); else if (id == ED_DRAWING_ID_CUSTOM_MOVE_ENTER) DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(custom_element.move_enter_element)); @@ -4292,7 +4185,7 @@ static void DrawDrawingArea(int id) for (x = 0; x < 3; x++) DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, - el2edimg(custom_element_change.target_content[x][y])); + el2edimg(custom_element_change.target_content.e[x][y])); else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER) DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(custom_element_change.trigger_element)); @@ -4309,7 +4202,7 @@ static void DrawDrawingArea(int id) for (x = 0; x < 3; x++) DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, - el2edimg(level.yamyam_content[nr][x][y])); + el2edimg(level.yamyam_content[nr].e[x][y])); } else if (id >= ED_DRAWING_ID_MAGIC_BALL_CONTENT_0 && id <= ED_DRAWING_ID_MAGIC_BALL_CONTENT_7) @@ -4320,7 +4213,7 @@ static void DrawDrawingArea(int id) for (x = 0; x < 3; x++) DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, - el2edimg(level.ball_content[nr][x][y])); + el2edimg(level.ball_content[nr].e[x][y])); } } @@ -5358,14 +5251,6 @@ static void MapCounterButtons(int id) struct GadgetInfo *gi_down = level_editor_gadget[gadget_id_down]; struct GadgetInfo *gi_text = level_editor_gadget[gadget_id_text]; struct GadgetInfo *gi_up = level_editor_gadget[gadget_id_up]; -#if 0 - char infotext[MAX_OUTPUT_LINESIZE + 1]; - int max_infotext_len = getMaxInfoTextLength(); - int xoffset_left = 0; - int yoffset_left = ED_BORDER_SIZE; - int xoffset_right = getCounterGadgetWidth(); - int yoffset_right = ED_BORDER_SIZE; -#else int xoffset_left = getTextWidthForGadget(counterbutton_info[id].text_left); int xoffset_right = ED_GADGET_TEXT_DISTANCE; int yoffset_above = MINI_TILEX + ED_GADGET_DISTANCE; @@ -5375,7 +5260,6 @@ static void MapCounterButtons(int id) int y_above = gi_down->y - yoffset_above; int x = gi_down->x; int y; /* set after gadget position was modified */ -#endif /* set position for "value1/value2" counter gadgets (score in most cases) */ if (id == ED_COUNTER_ID_ELEMENT_VALUE1 || @@ -5812,40 +5696,6 @@ static int setSelectboxValue(int selectbox_id, int new_value) static void copy_custom_element_settings(int element_from, int element_to) { -#if 0 - 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; @@ -5865,8 +5715,8 @@ static void copy_custom_element_settings(int element_from, int element_to) ei_to->access_direction = ei_from->access_direction; - ei_to->collect_score = ei_from->collect_score; - ei_to->collect_count = ei_from->collect_count; + ei_to->collect_score_initial = ei_from->collect_score_initial; + ei_to->collect_count_initial = ei_from->collect_count_initial; ei_to->push_delay_fixed = ei_from->push_delay_fixed; ei_to->push_delay_random = ei_from->push_delay_random; @@ -5887,7 +5737,7 @@ static void copy_custom_element_settings(int element_from, int element_to) for (y = 0; y < 3; y++) for (x = 0; x < 3; x++) - ei_to->content[x][y] = ei_from->content[x][y]; + 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; @@ -5907,8 +5757,6 @@ static void copy_custom_element_settings(int element_from, int element_to) if (ei_from->group != NULL && ei_to->group != NULL) /* group or internal */ *ei_to->group = *ei_from->group; -#endif - /* mark this custom element as modified */ ei_to->modified_settings = TRUE; } @@ -5924,8 +5772,8 @@ static void replace_custom_element_in_settings(int element_from, for (y = 0; y < 3; y++) for (x = 0; x < 3; x++) - if (ei->content[x][y] == element_from) - ei->content[x][y] = element_to; + if (ei->content.e[x][y] == element_from) + ei->content.e[x][y] = element_to; for (j = 0; j < ei->num_change_pages; j++) { @@ -5939,8 +5787,8 @@ static void replace_custom_element_in_settings(int element_from, for (y = 0; y < 3; y++) for (x = 0; x < 3; x++) - if (change->target_content[x][y] == element_from) - change->target_content[x][y] = element_to; + if (change->target_content.e[x][y] == element_from) + change->target_content.e[x][y] = element_to; } if (ei->group != NULL) /* group or internal */ @@ -6116,43 +5964,6 @@ static void CopyCustomElementPropertiesToEditor(int element) DONT_COLLIDE_WITH(element) || DONT_RUN_INTO(element)); -#if 0 - /* set explosion type selectbox help value */ - custom_element.explosion_type = - ( -#if 0 - IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE : -#endif - CAN_EXPLODE_1X1(element) ? EP_CAN_EXPLODE_1X1 : - CAN_EXPLODE_3X3(element) ? EP_CAN_EXPLODE_3X3 : - CAN_EXPLODE_CROSS(element) ? EP_CAN_EXPLODE_CROSS : - custom_element.explosion_type); - custom_element_properties[EP_CAN_EXPLODE_AT_ALL] = - ( -#if 0 - IS_INDESTRUCTIBLE(element) || -#endif - CAN_EXPLODE_1X1(element) || - CAN_EXPLODE_3X3(element) || - CAN_EXPLODE_CROSS(element)); -#endif - -#if 0 - /* special case: sub-settings dependent from main setting */ -#if 0 - custom_element.can_explode_by_fire = CAN_EXPLODE_BY_FIRE(element); - custom_element.can_explode_smashed = CAN_EXPLODE_SMASHED(element); - custom_element.can_explode_impact = CAN_EXPLODE_IMPACT(element); -#else - if (CAN_EXPLODE_BY_FIRE(element)) - custom_element.can_explode_by_fire = TRUE; - if (CAN_EXPLODE_SMASHED(element)) - custom_element.can_explode_smashed = TRUE; - if (CAN_EXPLODE_IMPACT(element)) - custom_element.can_explode_impact = TRUE; -#endif -#endif - /* ---------- element settings: advanced (custom elements) --------------- */ /* set "change by direct action" selectbox help value */ @@ -6169,24 +5980,26 @@ 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_COUNT_AT_ZERO) ? CE_COUNT_AT_ZERO : custom_element_change.direct_action); /* set "change by other element action" selectbox help value */ custom_element_change.other_action = - (HAS_CHANGE_EVENT(element, CE_OTHER_GETS_TOUCHED) ? CE_OTHER_GETS_TOUCHED : - HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PRESSED) ? CE_OTHER_GETS_PRESSED : - HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PUSHED) ? CE_OTHER_GETS_PUSHED : - HAS_CHANGE_EVENT(element, CE_OTHER_GETS_ENTERED) ? CE_OTHER_GETS_ENTERED : - HAS_CHANGE_EVENT(element, CE_OTHER_GETS_LEFT) ? CE_OTHER_GETS_LEFT : - HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DIGGED) ? CE_OTHER_GETS_DIGGED : - HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED : - HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DROPPED) ? CE_OTHER_GETS_DROPPED : - HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING : - HAS_CHANGE_EVENT(element, CE_OTHER_IS_HITTING) ? CE_OTHER_IS_HITTING : - HAS_CHANGE_EVENT(element, CE_OTHER_GETS_HIT) ? CE_OTHER_GETS_HIT : - HAS_CHANGE_EVENT(element, CE_OTHER_IS_SWITCHING) ? CE_OTHER_IS_SWITCHING : - HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING : - HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING : + (HAS_CHANGE_EVENT(element, CE_PLAYER_TOUCHES_X) ? CE_PLAYER_TOUCHES_X : + HAS_CHANGE_EVENT(element, CE_PLAYER_PRESSES_X) ? CE_PLAYER_PRESSES_X : + HAS_CHANGE_EVENT(element, CE_PLAYER_PUSHES_X) ? CE_PLAYER_PUSHES_X : + HAS_CHANGE_EVENT(element, CE_PLAYER_ENTERS_X) ? CE_PLAYER_ENTERS_X : + HAS_CHANGE_EVENT(element, CE_PLAYER_LEAVES_X) ? CE_PLAYER_LEAVES_X : + HAS_CHANGE_EVENT(element, CE_PLAYER_DIGS_X) ? CE_PLAYER_DIGS_X : + HAS_CHANGE_EVENT(element, CE_PLAYER_COLLECTS_X) ? CE_PLAYER_COLLECTS_X : + HAS_CHANGE_EVENT(element, CE_PLAYER_DROPS_X) ? CE_PLAYER_DROPS_X : + HAS_CHANGE_EVENT(element, CE_TOUCHING_X) ? CE_TOUCHING_X : + HAS_CHANGE_EVENT(element, CE_HITTING_X) ? CE_HITTING_X : + HAS_CHANGE_EVENT(element, CE_HIT_BY_X) ? CE_HIT_BY_X : + HAS_CHANGE_EVENT(element, CE_SWITCH_OF_X) ? CE_SWITCH_OF_X : + HAS_CHANGE_EVENT(element, CE_CHANGE_OF_X) ? CE_CHANGE_OF_X : + HAS_CHANGE_EVENT(element, CE_EXPLOSION_OF_X) ? CE_EXPLOSION_OF_X : + HAS_CHANGE_EVENT(element, CE_COUNT_AT_ZERO_OF_X) ? CE_COUNT_AT_ZERO_OF_X : custom_element_change.other_action); } @@ -6198,7 +6011,6 @@ static void CopyGroupElementPropertiesToEditor(int element) static void CopyClassicElementPropertiesToEditor(int element) { -#if 1 if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element)) custom_element_properties[EP_CAN_MOVE_INTO_ACID] = getMoveIntoAcidProperty(&level, element); @@ -6206,17 +6018,6 @@ static void CopyClassicElementPropertiesToEditor(int element) if (MAYBE_DONT_COLLIDE_WITH(element)) custom_element_properties[EP_DONT_COLLIDE_WITH] = getDontCollideWithProperty(&level, element); -#else - - if (COULD_MOVE_INTO_ACID(element)) - { - int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID); - - if (bit_nr > -1) - custom_element_properties[EP_CAN_MOVE_INTO_ACID] = - ((level.can_move_into_acid_bits & (1 << bit_nr)) != 0); - } -#endif } static void CopyElementPropertiesToEditor(int element) @@ -6233,9 +6034,6 @@ static void CopyCustomElementPropertiesToGame(int element) { int i; int access_type_and_layer; -#if 0 - boolean can_explode; -#endif /* mark that this custom element has been modified */ custom_element.modified_settings = TRUE; @@ -6301,48 +6099,6 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_properties[custom_element.deadliness] = custom_element_properties[EP_DEADLY]; -#if 0 - /* set explosion type property from checkbox and selectbox */ -#if 0 - custom_element_properties[EP_INDESTRUCTIBLE] = FALSE; -#endif - custom_element_properties[EP_CAN_EXPLODE_1X1] = FALSE; - custom_element_properties[EP_CAN_EXPLODE_3X3] = FALSE; - custom_element_properties[EP_CAN_EXPLODE_CROSS] = FALSE; - custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = FALSE; - custom_element_properties[EP_CAN_EXPLODE_SMASHED] = FALSE; - custom_element_properties[EP_CAN_EXPLODE_IMPACT] = FALSE; - custom_element_properties[custom_element.explosion_type] = - custom_element_properties[EP_CAN_EXPLODE_AT_ALL]; -#endif - -#if 0 - /* special case: sub-settings dependent from main setting */ -#if 0 - can_explode = (custom_element_properties[EP_CAN_EXPLODE_1X1] || - custom_element_properties[EP_CAN_EXPLODE_3X3] || - custom_element_properties[EP_CAN_EXPLODE_CROSS]); - custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = - (can_explode && custom_element.can_explode_by_fire); - custom_element_properties[EP_CAN_EXPLODE_SMASHED] = - (can_explode && custom_element.can_explode_smashed); - custom_element_properties[EP_CAN_EXPLODE_IMPACT] = - (can_explode && custom_element.can_explode_impact); -#else - if (custom_element_properties[EP_CAN_EXPLODE_1X1] || - custom_element_properties[EP_CAN_EXPLODE_3X3] || - custom_element_properties[EP_CAN_EXPLODE_CROSS]) - { - custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = - custom_element.can_explode_by_fire; - custom_element_properties[EP_CAN_EXPLODE_SMASHED] = - custom_element.can_explode_smashed; - custom_element_properties[EP_CAN_EXPLODE_IMPACT] = - custom_element.can_explode_impact; - } -#endif -#endif - /* ---------- element settings: advanced (custom elements) --------------- */ /* set player change event from checkbox and selectbox */ @@ -6358,24 +6114,26 @@ 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_COUNT_AT_ZERO] = FALSE; custom_element_change_events[custom_element_change.direct_action] = custom_element_change_events[CE_BY_DIRECT_ACTION]; /* set other element action change event from checkbox and selectbox */ - custom_element_change_events[CE_OTHER_GETS_TOUCHED] = FALSE; - custom_element_change_events[CE_OTHER_GETS_PRESSED] = FALSE; - custom_element_change_events[CE_OTHER_GETS_PUSHED] = FALSE; - custom_element_change_events[CE_OTHER_GETS_ENTERED] = FALSE; - custom_element_change_events[CE_OTHER_GETS_LEFT] = FALSE; - custom_element_change_events[CE_OTHER_GETS_DIGGED] = FALSE; - custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE; - custom_element_change_events[CE_OTHER_GETS_DROPPED] = FALSE; - custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE; - custom_element_change_events[CE_OTHER_IS_HITTING] = FALSE; - custom_element_change_events[CE_OTHER_GETS_HIT] = FALSE; - custom_element_change_events[CE_OTHER_IS_SWITCHING] = FALSE; - custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE; - custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE; + custom_element_change_events[CE_PLAYER_TOUCHES_X] = FALSE; + custom_element_change_events[CE_PLAYER_PRESSES_X] = FALSE; + custom_element_change_events[CE_PLAYER_PUSHES_X] = FALSE; + custom_element_change_events[CE_PLAYER_ENTERS_X] = FALSE; + custom_element_change_events[CE_PLAYER_LEAVES_X] = FALSE; + custom_element_change_events[CE_PLAYER_DIGS_X] = FALSE; + custom_element_change_events[CE_PLAYER_COLLECTS_X] = FALSE; + custom_element_change_events[CE_PLAYER_DROPS_X] = FALSE; + custom_element_change_events[CE_TOUCHING_X] = FALSE; + custom_element_change_events[CE_HITTING_X] = FALSE; + custom_element_change_events[CE_HIT_BY_X] = FALSE; + custom_element_change_events[CE_SWITCH_OF_X] = FALSE; + custom_element_change_events[CE_CHANGE_OF_X] = FALSE; + custom_element_change_events[CE_EXPLOSION_OF_X] = FALSE; + custom_element_change_events[CE_COUNT_AT_ZERO_OF_X] = FALSE; custom_element_change_events[custom_element_change.other_action] = custom_element_change_events[CE_BY_OTHER_ACTION]; @@ -6402,7 +6160,6 @@ static void CopyGroupElementPropertiesToGame(int element) static void CopyClassicElementPropertiesToGame(int element) { -#if 1 if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element)) setMoveIntoAcidProperty(&level, element, custom_element_properties[EP_CAN_MOVE_INTO_ACID]); @@ -6410,21 +6167,6 @@ static void CopyClassicElementPropertiesToGame(int element) if (MAYBE_DONT_COLLIDE_WITH(element)) setDontCollideWithProperty(&level, element, custom_element_properties[EP_DONT_COLLIDE_WITH]); -#else - - if (COULD_MOVE_INTO_ACID(element)) - { - int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID); - - if (bit_nr > -1) - { - level.can_move_into_acid_bits &= ~(1 << bit_nr); - - if (custom_element_properties[EP_CAN_MOVE_INTO_ACID]) - level.can_move_into_acid_bits |= (1 << bit_nr); - } - } -#endif } static void CopyElementPropertiesToGame(int element) @@ -6464,11 +6206,6 @@ void DrawLevelEd() BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, DOOR_GFX_PAGEX6, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY); -#if 0 - /* draw mouse button brush elements */ - RedrawDrawingElements(); -#endif - /* draw bigger door */ DrawSpecialEditorDoor(); @@ -6479,9 +6216,6 @@ void DrawLevelEd() redraw_mask |= REDRAW_ALL; ReinitializeElementListButtons(); /* custom element may look different */ -#if 0 - ModifyEditorElementList(); /* may be needed for custom elements */ -#endif UnmapTapeButtons(); MapControlButtons(); @@ -6824,7 +6558,7 @@ static void DrawMagicBallContentAreas() int y = SY + ED_AREA_MAGIC_BALL_CONTENT_YPOS(0) + ED_BORDER_AREA_YSIZE; int i; - for (i = 0; i < NUM_MAGIC_BALL_CONTENTS; i++) + for (i = 0; i < MAX_ELEMENT_CONTENTS; i++) MapDrawingArea(ED_DRAWING_ID_MAGIC_BALL_CONTENT_0 + i); DrawText(x, y + 0 * MINI_TILEY, "generated", FONT_TEXT_1); @@ -6916,8 +6650,6 @@ static boolean PrintInfoText(char *text, int font_nr, int start_line) return TRUE; } -#if 1 - static int PrintElementDescriptionFromFile(char *filename, int start_line) { int font_nr = FONT_TEXT_2; @@ -6934,97 +6666,6 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line) max_lines_per_screen); } -#else - -static int PrintElementDescriptionFromFile(char *filename, int start_line) -{ - int font_nr = FONT_TEXT_2; - int font_width = getFontWidth(font_nr); - int font_height = getFontHeight(font_nr); - int pad_x = ED_ELEMENT_SETTINGS_XPOS(0); - int pad_y = ED_ELEMENT_SETTINGS_YPOS(0) + ED_BORDER_SIZE; - int sx = SX + pad_x; - int sy = SY + pad_y; - int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width; - int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; - int current_line = start_line; - char line[MAX_LINE_LEN]; - char buffer[max_chars_per_line + 1]; - int buffer_len; - FILE *file; - - if (current_line >= max_lines_per_screen) - return 0; - - if (filename == NULL) - return 0; - - if (!(file = fopen(filename, MODE_READ))) - return 0; - - buffer[0] = '\0'; - buffer_len = 0; - - while (!feof(file) && current_line < max_lines_per_screen) - { - char *line_ptr; - boolean last_line_was_empty = TRUE; - - /* read next line of input file */ - if (!fgets(line, MAX_LINE_LEN, file)) - break; - - /* skip comments (lines directly beginning with '#') */ - if (line[0] == '#') - continue; - - /* cut trailing newline from input line */ - for (line_ptr = line; *line_ptr; line_ptr++) - { - if (*line_ptr == '\n' || *line_ptr == '\r') - { - *line_ptr = '\0'; - break; - } - } - - if (strlen(line) == 0) /* special case: force empty line */ - strcpy(line, "\n"); - - line_ptr = line; - - while (*line_ptr && current_line < max_lines_per_screen) - { - boolean buffer_filled = RenderLineToBuffer(&line_ptr, - buffer, &buffer_len, - last_line_was_empty, - max_chars_per_line); - if (buffer_filled) - { - DrawText(sx, sy + current_line * font_height, buffer, font_nr); - current_line++; - - last_line_was_empty = (buffer_len == 0); - - buffer[0] = '\0'; - buffer_len = 0; - } - } - } - - fclose(file); - - if (buffer_len > 0 && current_line < max_lines_per_screen) - { - DrawText(sx, sy + current_line * font_height, buffer, font_nr); - current_line++; - } - - return (current_line - start_line); -} - -#endif - static void DrawPropertiesTabulatorGadgets() { struct GadgetInfo *gd_gi = level_editor_gadget[GADGET_ID_PROPERTIES_INFO]; @@ -7269,17 +6910,10 @@ 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_EMC_KEY_5, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_EMC_KEY_6, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_EMC_KEY_7, &level.score[SC_KEY], TEXT_COLLECTING }, @@ -7838,6 +7472,7 @@ static void DrawArc(int from_x, int from_y, int to_x, int to_y, } #define DRAW_CIRCLES_BUTTON_AVAILABLE 0 + #if DRAW_CIRCLES_BUTTON_AVAILABLE static void DrawCircle(int from_x, int from_y, int to_x, int to_y, int element, boolean change_level) @@ -7896,6 +7531,7 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y, #define CB_BRUSH_TO_LEVEL 2 #define CB_DELETE_OLD_CURSOR 3 #define CB_DUMP_BRUSH 4 +#define CB_DUMP_BRUSH_SMALL 5 static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, int button, int mode) @@ -7907,7 +7543,8 @@ 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 (mode == CB_DUMP_BRUSH || + mode == CB_DUMP_BRUSH_SMALL) { if (!draw_with_brush) { @@ -7923,42 +7560,14 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, int element = brush_buffer[x][y]; int element_mapped = element; -#if 0 - 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); - -#else - if (IS_CUSTOM_ELEMENT(element)) element_mapped = EL_CUSTOM_START; - else if (element > EL_ENVELOPE_4) - element_mapped = EL_CHAR_QUESTION; /* change to EL_UNKNOWN ... */ + else if (IS_GROUP_ELEMENT(element)) + element_mapped = EL_GROUP_START; + else if (element >= NUM_FILE_ELEMENTS) + element_mapped = EL_UNKNOWN; - printf("`%03d", element_mapped); -#endif + printf("%c%03d", (mode == CB_DUMP_BRUSH ? '`' : 'ΒΈ'), element_mapped); } printf("\n"); @@ -8086,6 +7695,11 @@ void DumpBrush() CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH); } +void DumpBrush_Small() +{ + CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH_SMALL); +} + static void FloodFill(int from_x, int from_y, int fill_element) { int i,x,y; @@ -8415,6 +8029,11 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) if (!started_inside_drawing_area) return; +#if 1 + if (!IS_VALID_BUTTON(button)) + return; +#endif + if (!button && !button_release_event) return; @@ -8505,7 +8124,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) } else if (id == GADGET_ID_CUSTOM_CONTENT) { - custom_element.content[sx][sy] = new_element; + custom_element.content.e[sx][sy] = new_element; CopyCustomElementPropertiesToGame(properties_element); } @@ -8529,7 +8148,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) } else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) { - custom_element_change.target_content[sx][sy] = new_element; + custom_element_change.target_content.e[sx][sy] = new_element; CopyCustomElementPropertiesToGame(properties_element); } @@ -8549,11 +8168,11 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) random_placement_background_element = new_element; else if (id >= GADGET_ID_YAMYAM_CONTENT_0 && id <= GADGET_ID_YAMYAM_CONTENT_7) - level.yamyam_content[id - GADGET_ID_YAMYAM_CONTENT_0][sx][sy] = + level.yamyam_content[id - GADGET_ID_YAMYAM_CONTENT_0].e[sx][sy] = new_element; else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 && id <= GADGET_ID_MAGIC_BALL_CONTENT_7) - level.ball_content[id - GADGET_ID_MAGIC_BALL_CONTENT_0][sx][sy] = + level.ball_content[id - GADGET_ID_MAGIC_BALL_CONTENT_0].e[sx][sy] = new_element; } break; @@ -8658,7 +8277,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) else if (id == GADGET_ID_CUSTOM_GRAPHIC) PickDrawingElement(button, custom_element.gfx_element); else if (id == GADGET_ID_CUSTOM_CONTENT) - PickDrawingElement(button, custom_element.content[sx][sy]); + PickDrawingElement(button, custom_element.content.e[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) @@ -8666,7 +8285,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) PickDrawingElement(button, custom_element_change.target_element); else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - PickDrawingElement(button, custom_element_change.target_content[sx][sy]); + PickDrawingElement(button, custom_element_change.target_content.e[sx][sy]); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) PickDrawingElement(button, custom_element_change.trigger_element); else if (id == GADGET_ID_GROUP_CONTENT) @@ -8678,14 +8297,14 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) { int i = id - GADGET_ID_YAMYAM_CONTENT_0; - PickDrawingElement(button, level.yamyam_content[i][sx][sy]); + PickDrawingElement(button, level.yamyam_content[i].e[sx][sy]); } else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 && id <= GADGET_ID_MAGIC_BALL_CONTENT_7) { int i = id - GADGET_ID_MAGIC_BALL_CONTENT_0; - PickDrawingElement(button, level.ball_content[i][sx][sy]); + PickDrawingElement(button, level.ball_content[i].e[sx][sy]); } break; @@ -8985,6 +8604,14 @@ static void HandleControlButtons(struct GadgetInfo *gi) int new_element = BUTTON_ELEMENT(button); int x, y; +#if 0 + /* MAKES PROBLEMS WITH ELEMENT LIST SCROLLBAR AND IS PROBABLY NOT NEEDED */ + /* !!! CHECK WHAT HAPPENS WHEN MOUSE WHEEL IS USED OVER ELEMENT LIST !!! */ + + if (!IS_VALID_BUTTON(button)) + return; +#endif + if (edit_mode == ED_MODE_DRAWING && drawing_function == GADGET_ID_TEXT) DrawLevelText(0, 0, 0, TEXT_END); @@ -9292,13 +8919,9 @@ static void HandleControlButtons(struct GadgetInfo *gi) DrawCompleteVideoDisplay(); - if (setup.autorecord) - TapeStartRecording(); - level_editor_test_game = TRUE; - game_status = GAME_MODE_PLAYING; - InitGame(); + StartGameActions(FALSE, setup.autorecord, NEW_RANDOMIZE); } break; @@ -9614,35 +9237,16 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) 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); - else - 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 */ @@ -9663,7 +9267,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) else if (id == GADGET_ID_CUSTOM_GRAPHIC) element = custom_element.gfx_element; else if (id == GADGET_ID_CUSTOM_CONTENT) - element = custom_element.content[sx][sy]; + element = custom_element.content.e[sx][sy]; else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) element = custom_element.move_enter_element; else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) @@ -9671,7 +9275,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) element = custom_element_change.target_element; else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - element = custom_element_change.target_content[sx][sy]; + element = custom_element_change.target_content.e[sx][sy]; else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) element = custom_element_change.trigger_element; else if (id == GADGET_ID_GROUP_CONTENT) @@ -9680,10 +9284,10 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) element = random_placement_background_element; else if (id >= GADGET_ID_YAMYAM_CONTENT_0 && id <= GADGET_ID_YAMYAM_CONTENT_7) - element = level.yamyam_content[id - GADGET_ID_YAMYAM_CONTENT_0][sx][sy]; + element = level.yamyam_content[id -GADGET_ID_YAMYAM_CONTENT_0].e[sx][sy]; else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 && id <= GADGET_ID_MAGIC_BALL_CONTENT_7) - element = level.ball_content[id -GADGET_ID_MAGIC_BALL_CONTENT_0][sx][sy]; + element =level.ball_content[id-GADGET_ID_MAGIC_BALL_CONTENT_0].e[sx][sy]; strncpy(infotext, getElementInfoText(element), max_infotext_len); }