X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=1fb196e4456dca06bbf6000fded528b698736083;hb=b180608242f0190c6c8b31772e4dcfce2e9af47c;hp=a36f0696ce037e01e7645378bf9bba37e8928956;hpb=4add6d49e770bbdcd7dc4176fdec56d6dad16bb2;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index a36f0696..1fb196e4 100644 --- a/src/editor.c +++ b/src/editor.c @@ -439,18 +439,19 @@ #define GADGET_ID_MAGIC_BALL_CONTENT_6 (GADGET_ID_DRAWING_AREA_FIRST + 15) #define GADGET_ID_MAGIC_BALL_CONTENT_7 (GADGET_ID_DRAWING_AREA_FIRST + 16) #define GADGET_ID_AMOEBA_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 17) -#define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 18) -#define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 19) -#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 20) -#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 21) -#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 22) -#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 23) -#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 24) -#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 25) -#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 26) +#define GADGET_ID_START_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 18) +#define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 19) +#define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 20) +#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 21) +#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 22) +#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 23) +#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 24) +#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 25) +#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 26) +#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 27) /* text input identifiers */ -#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 27) +#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 28) #define GADGET_ID_LEVEL_NAME (GADGET_ID_TEXT_INPUT_FIRST + 0) #define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1) @@ -540,43 +541,46 @@ #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_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 7) -#define GADGET_ID_DOUBLE_SPEED (GADGET_ID_CHECKBUTTON_FIRST + 8) -#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 9) -#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 10) -#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 11) -#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 12) -#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 13) -#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 14) -#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 15) -#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 16) -#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 18) -#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 19) -#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 24) -#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 25) -#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 26) -#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 27) -#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 28) -#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 29) -#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 30) -#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 31) -#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 32) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 33) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 34) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 35) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 36) -#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 37) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 38) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 39) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 40) +#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 7) +#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 8) +#define GADGET_ID_DOUBLE_SPEED (GADGET_ID_CHECKBUTTON_FIRST + 9) +#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 10) +#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 11) +#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12) +#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 13) +#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 14) +#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 15) +#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 16) +#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 17) +#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 18) +#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 19) +#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 20) +#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 22) +#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 23) +#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 28) +#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 29) +#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 30) +#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 31) +#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 32) +#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 33) +#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 34) +#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 35) +#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 36) +#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 37) +#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 38) +#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 39) +#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 40) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 41) +#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 42) +#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 43) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 41) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 44) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -755,42 +759,45 @@ #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_GROW_INTO_DIGGABLE 5 -#define ED_CHECKBUTTON_ID_DOUBLE_SPEED 6 -#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 7 -#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 8 -#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 9 -#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 10 -#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 11 -#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 12 -#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 13 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 14 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 15 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 16 -#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 17 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 18 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 19 -#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 20 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 21 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 22 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 23 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 24 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 25 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 26 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 27 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 28 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 29 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 30 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 31 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 32 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 33 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 34 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 35 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 36 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 37 -#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 38 - -#define ED_NUM_CHECKBUTTONS 39 +#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 5 +#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 6 +#define ED_CHECKBUTTON_ID_DOUBLE_SPEED 7 +#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 8 +#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 9 +#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 10 +#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 11 +#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 12 +#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 13 +#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 14 +#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 15 +#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 16 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 17 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 18 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 19 +#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 20 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 21 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 22 +#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 23 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 24 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 25 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 26 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 27 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 28 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 29 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 30 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 31 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 32 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 33 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 34 +#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 35 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 36 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 37 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 38 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 39 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 40 +#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 41 + +#define ED_NUM_CHECKBUTTONS 42 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_INITIAL_GRAVITY #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED @@ -833,17 +840,18 @@ #define ED_DRAWING_ID_MAGIC_BALL_CONTENT_6 15 #define ED_DRAWING_ID_MAGIC_BALL_CONTENT_7 16 #define ED_DRAWING_ID_AMOEBA_CONTENT 17 -#define ED_DRAWING_ID_CUSTOM_GRAPHIC 18 -#define ED_DRAWING_ID_CUSTOM_CONTENT 19 -#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 20 -#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 21 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 22 -#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 23 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 24 -#define ED_DRAWING_ID_GROUP_CONTENT 25 -#define ED_DRAWING_ID_RANDOM_BACKGROUND 26 +#define ED_DRAWING_ID_START_ELEMENT 18 +#define ED_DRAWING_ID_CUSTOM_GRAPHIC 19 +#define ED_DRAWING_ID_CUSTOM_CONTENT 20 +#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 21 +#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 22 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 23 +#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 24 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 25 +#define ED_DRAWING_ID_GROUP_CONTENT 26 +#define ED_DRAWING_ID_RANDOM_BACKGROUND 27 -#define ED_NUM_DRAWING_AREAS 27 +#define ED_NUM_DRAWING_AREAS 28 /* @@ -1015,7 +1023,7 @@ static struct GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP, GADGET_ID_LEVEL_TIMESCORE_TEXT, GADGET_ID_NONE, &level.score[SC_TIME_BONUS], - "score for each 10 sec/steps left:", NULL, NULL + "score for each second/step left:", NULL, NULL }, { ED_LEVEL_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(8), @@ -1474,6 +1482,8 @@ static struct ValueTextInfo options_change_direct_action[] = { { CE_TOUCHED_BY_PLAYER, "touched by player" }, { CE_PRESSED_BY_PLAYER, "pressed by player" }, + { CE_SWITCHED_BY_PLAYER, "switched by player" }, + { CE_SNAPPED_BY_PLAYER, "snapped by player" }, { CE_PUSHED_BY_PLAYER, "pushed by player" }, { CE_ENTERED_BY_PLAYER, "entered by player" }, { CE_LEFT_BY_PLAYER, "left by player" }, @@ -1495,6 +1505,8 @@ static struct ValueTextInfo options_change_other_action[] = { { CE_PLAYER_TOUCHES_X, "player touches" }, { CE_PLAYER_PRESSES_X, "player presses" }, + { CE_PLAYER_SWITCHES_X, "player switches" }, + { CE_PLAYER_SNAPS_X, "player snaps" }, { CE_PLAYER_PUSHES_X, "player pushes" }, { CE_PLAYER_ENTERS_X, "player enters" }, { CE_PLAYER_LEAVES_X, "player leaves" }, @@ -1507,6 +1519,7 @@ static struct ValueTextInfo options_change_other_action[] = { CE_SWITCH_OF_X, "switch of" }, { CE_CHANGE_OF_X, "change by page of" }, { CE_EXPLOSION_OF_X, "explosion of" }, + { CE_MOVE_OF_X, "move of" }, { CE_VALUE_GETS_ZERO_OF_X, "CE value gets 0 of" }, { -1, NULL } @@ -1590,25 +1603,28 @@ static struct ValueTextInfo options_change_replace_when[] = static struct ValueTextInfo options_action_type[] = { { CA_NO_ACTION, "no action" }, - { CA_EXIT_PLAYER, "exit player" }, - { CA_KILL_PLAYER, "kill player" }, + { CA_UNDEFINED, " " }, + { CA_HEADLINE_LEVEL_ACTIONS, "[level actions]" }, { CA_RESTART_LEVEL, "restart level" }, { CA_SHOW_ENVELOPE, "show envelope" }, - { CA_ADD_KEY, "add key" }, - { CA_REMOVE_KEY, "remove key" }, - { CA_SET_PLAYER_SPEED, "set player speed" }, - { CA_SET_PLAYER_GRAVITY, "set gravity" }, - { CA_SET_WIND_DIRECTION, "set wind dir." }, + { CA_SET_LEVEL_TIME, "set time" }, + { CA_SET_LEVEL_SCORE, "set score" }, { CA_SET_LEVEL_GEMS, "set needed gems" }, - { CA_SET_LEVEL_TIME, "set level time" }, - { CA_SET_LEVEL_SCORE, "set level score" }, + { CA_SET_LEVEL_GRAVITY, "set gravity" }, + { CA_SET_LEVEL_WIND, "set wind dir." }, + { CA_UNDEFINED, " " }, + { CA_HEADLINE_PLAYER_ACTIONS, "[player actions]" }, + { CA_MOVE_PLAYER, "move player" }, + { CA_EXIT_PLAYER, "exit player" }, + { CA_KILL_PLAYER, "kill player" }, + { CA_SET_PLAYER_KEYS, "set keys" }, + { CA_SET_PLAYER_SPEED, "set speed" }, + { CA_SET_PLAYER_SHIELD, "set shield" }, + { 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" }, -#if 0 - { CA_SET_DYNABOMB_NUMBER, "set bomb number" }, - { CA_SET_DYNABOMB_SIZE, "set bomb size" }, - { CA_SET_DYNABOMB_POWER, "set bomb power" }, -#endif { -1, NULL } }; @@ -1620,14 +1636,22 @@ static struct ValueTextInfo options_action_mode_none[] = { -1, NULL } }; -static struct ValueTextInfo options_action_mode_set[] = +static struct ValueTextInfo options_action_mode_assign[] = { { CA_MODE_SET, "=" }, { -1, NULL } }; -static struct ValueTextInfo options_action_mode_calc[] = +static struct ValueTextInfo options_action_mode_add_remove[] = +{ + { CA_MODE_ADD, "+" }, + { CA_MODE_SUBTRACT, "-" }, + + { -1, NULL } +}; + +static struct ValueTextInfo options_action_mode_calculate[] = { { CA_MODE_SET, "=" }, { CA_MODE_ADD, "+" }, @@ -1681,6 +1705,10 @@ static struct ValueTextInfo options_action_arg_number[] = { CA_ARG_NUMBER_CE_SCORE, "CE score" }, { CA_ARG_NUMBER_CE_VALUE, "CE value" }, { CA_ARG_UNDEFINED, " " }, + { CA_ARG_NUMBER_LEVEL_TIME, "time" }, + { CA_ARG_NUMBER_LEVEL_GEMS, "gems" }, + { CA_ARG_NUMBER_LEVEL_SCORE, "score" }, + { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_HEADLINE, "[CE value" }, { CA_ARG_ELEMENT_HEADLINE, " of" }, { CA_ARG_ELEMENT_HEADLINE, " element]" }, @@ -1690,17 +1718,13 @@ static struct ValueTextInfo options_action_arg_number[] = { -1, NULL } }; -static struct ValueTextInfo options_action_arg_key[] = +static struct ValueTextInfo options_action_arg_envelope[] = { { CA_ARG_NUMBER_HEADLINE, "[number]" }, { CA_ARG_1, "1" }, { CA_ARG_2, "2" }, { CA_ARG_3, "3" }, { CA_ARG_4, "4" }, - { CA_ARG_5, "5" }, - { CA_ARG_6, "6" }, - { CA_ARG_7, "7" }, - { CA_ARG_8, "8" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_TARGET, "target" }, @@ -1709,13 +1733,17 @@ static struct ValueTextInfo options_action_arg_key[] = { -1, NULL } }; -static struct ValueTextInfo options_action_arg_envelope[] = +static struct ValueTextInfo options_action_arg_key[] = { { CA_ARG_NUMBER_HEADLINE, "[number]" }, { CA_ARG_1, "1" }, { CA_ARG_2, "2" }, { CA_ARG_3, "3" }, { CA_ARG_4, "4" }, + { CA_ARG_5, "5" }, + { CA_ARG_6, "6" }, + { CA_ARG_7, "7" }, + { CA_ARG_8, "8" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_TARGET, "target" }, @@ -1727,6 +1755,7 @@ static struct ValueTextInfo options_action_arg_envelope[] = static struct ValueTextInfo options_action_arg_speed[] = { { CA_ARG_SPEED_HEADLINE, "[speed]" }, + { CA_ARG_SPEED_NOT_MOVING, "frozen" }, { CA_ARG_SPEED_VERY_SLOW, "very slow" }, { CA_ARG_SPEED_SLOW, "slow" }, { CA_ARG_SPEED_NORMAL, "normal" }, @@ -1742,6 +1771,27 @@ static struct ValueTextInfo options_action_arg_speed[] = { -1, NULL } }; +static struct ValueTextInfo options_action_arg_shield[] = +{ + { CA_ARG_SHIELD_HEADLINE, "[shield]" }, + { CA_ARG_SHIELD_OFF, "off" }, + { CA_ARG_SHIELD_NORMAL, "normal" }, + { CA_ARG_SHIELD_DEADLY, "deadly" }, + + { -1, NULL } +}; + +static struct ValueTextInfo options_action_arg_artwork[] = +{ + { CA_ARG_ELEMENT_HEADLINE, "[element]" }, + { CA_ARG_ELEMENT_TARGET, "target" }, + { CA_ARG_ELEMENT_TRIGGER, "trigger" }, + { CA_ARG_UNDEFINED, " " }, + { CA_ARG_ELEMENT_RESET, "reset" }, + + { -1, NULL } +}; + static struct ValueTextInfo options_action_arg_gravity[] = { { CA_ARG_GRAVITY_HEADLINE, "[gravity]" }, @@ -1761,6 +1811,7 @@ static struct ValueTextInfo options_action_arg_direction[] = { CA_ARG_DIRECTION_UP, "up" }, { CA_ARG_DIRECTION_DOWN, "down" }, { CA_ARG_DIRECTION_TRIGGER, "trigger" }, + { CA_ARG_DIRECTION_TRIGGER_BACK, "-trigger" }, { -1, NULL } }; @@ -1785,8 +1836,9 @@ static struct ValueTextInfo options_group_choice_mode[] = static struct ValueTextInfo *action_arg_modes[] = { options_action_mode_none, - options_action_mode_set, - options_action_mode_calc, + options_action_mode_assign, + options_action_mode_add_remove, + options_action_mode_calculate, }; static struct @@ -1800,18 +1852,20 @@ action_arg_options[] = { CA_NO_ACTION, 0, options_action_arg_none, }, { CA_EXIT_PLAYER, 0, options_action_arg_player, }, { CA_KILL_PLAYER, 0, options_action_arg_player, }, + { CA_MOVE_PLAYER, 0, options_action_arg_direction, }, { CA_RESTART_LEVEL, 0, options_action_arg_none, }, { CA_SHOW_ENVELOPE, 0, options_action_arg_envelope, }, - { CA_ADD_KEY, 0, options_action_arg_key, }, - { CA_REMOVE_KEY, 0, options_action_arg_key, }, + { 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_LEVEL_GEMS, 2, options_action_arg_number, }, - { CA_SET_LEVEL_TIME, 2, options_action_arg_number, }, - { CA_SET_LEVEL_SCORE, 2, options_action_arg_number, }, - { CA_SET_CE_SCORE, 2, options_action_arg_number, }, - { CA_SET_CE_VALUE, 2, options_action_arg_number, }, - { CA_SET_PLAYER_GRAVITY, 1, options_action_arg_gravity, }, - { CA_SET_WIND_DIRECTION, 1, options_action_arg_direction, }, + { CA_SET_PLAYER_SHIELD, 1, options_action_arg_shield, }, + { CA_SET_PLAYER_ARTWORK, 1, options_action_arg_artwork, }, + { CA_SET_CE_SCORE, 3, options_action_arg_number, }, + { CA_SET_CE_VALUE, 3, options_action_arg_number, }, { -1, FALSE, NULL } }; @@ -1998,7 +2052,7 @@ static struct -1, options_change_trigger_side, &custom_element_change.trigger_side, - "at", "side", "element side that causes change" + "at", "side", "element side triggering change" }, { ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(7), @@ -2327,6 +2381,13 @@ static struct NULL, "use spring pushing bug", "use odd spring pushing behaviour" }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_USE_TIME_ORB_BUG, GADGET_ID_NONE, + &level.use_time_orb_bug, + NULL, + "use time orb bug", "use odd time orb behaviour" + }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_GROW_INTO_DIGGABLE, GADGET_ID_NONE, @@ -2341,6 +2402,13 @@ static struct NULL, "double speed movement", "set initial movement speed of player" }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), + GADGET_ID_BLOCK_SNAP_FIELD, GADGET_ID_NONE, + &level.block_snap_field, + NULL, + "block snapped field when snapping", "use snapping delay to show animation" + }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_BLOCK_LAST_FIELD, GADGET_ID_NONE, @@ -2362,6 +2430,13 @@ static struct NULL, "no scrolling when relocating", "player gets relocated without delay" }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6), + GADGET_ID_USE_START_ELEMENT, GADGET_ID_NONE, + &level.use_start_element[0], + NULL, + "use level start element:", "start level at this element's position" + }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_CAN_PASS_TO_WALKABLE, GADGET_ID_NONE, @@ -2560,130 +2635,140 @@ static struct static struct { int x, y; - int area_xsize, area_ysize; int gadget_id; int gadget_id_align; - char *text_left, *text_right, *text_below; + int *value; + int area_xsize, area_ysize; + char *text_left, *text_right, *text_below, *infotext; } drawingarea_info[ED_NUM_DRAWING_AREAS] = { /* ---------- level playfield content ------------------------------------ */ { - 0, 0, - MAX_ED_FIELDX, MAX_ED_FIELDY, + 0, 0, GADGET_ID_DRAWING_LEVEL, GADGET_ID_NONE, - NULL, NULL, NULL + NULL, MAX_ED_FIELDX, MAX_ED_FIELDY, + NULL, NULL, NULL, NULL }, /* ---------- yam yam content -------------------------------------------- */ { ED_AREA_YAMYAM_CONTENT_XPOS(0), ED_AREA_YAMYAM_CONTENT_YPOS(0), - 3, 3, GADGET_ID_YAMYAM_CONTENT_0, GADGET_ID_NONE, - NULL, NULL, "1" + &level.yamyam_content[0].e[0][0], 3, 3, + NULL, NULL, "1", NULL }, { ED_AREA_YAMYAM_CONTENT_XPOS(1), ED_AREA_YAMYAM_CONTENT_YPOS(1), - 3, 3, GADGET_ID_YAMYAM_CONTENT_1, GADGET_ID_NONE, - NULL, NULL, "2" + &level.yamyam_content[1].e[0][0], 3, 3, + NULL, NULL, "2", NULL }, { ED_AREA_YAMYAM_CONTENT_XPOS(2), ED_AREA_YAMYAM_CONTENT_YPOS(2), - 3, 3, GADGET_ID_YAMYAM_CONTENT_2, GADGET_ID_NONE, - NULL, NULL, "3" + &level.yamyam_content[2].e[0][0], 3, 3, + NULL, NULL, "3", NULL }, { ED_AREA_YAMYAM_CONTENT_XPOS(3), ED_AREA_YAMYAM_CONTENT_YPOS(3), - 3, 3, GADGET_ID_YAMYAM_CONTENT_3, GADGET_ID_NONE, - NULL, NULL, "4" + &level.yamyam_content[3].e[0][0], 3, 3, + NULL, NULL, "4", NULL }, { ED_AREA_YAMYAM_CONTENT_XPOS(4), ED_AREA_YAMYAM_CONTENT_YPOS(4), - 3, 3, GADGET_ID_YAMYAM_CONTENT_4, GADGET_ID_NONE, - NULL, NULL, "5" + &level.yamyam_content[4].e[0][0], 3, 3, + NULL, NULL, "5", NULL }, { ED_AREA_YAMYAM_CONTENT_XPOS(5), ED_AREA_YAMYAM_CONTENT_YPOS(5), - 3, 3, GADGET_ID_YAMYAM_CONTENT_5, GADGET_ID_NONE, - NULL, NULL, "6" + &level.yamyam_content[5].e[0][0], 3, 3, + NULL, NULL, "6", NULL }, { ED_AREA_YAMYAM_CONTENT_XPOS(6), ED_AREA_YAMYAM_CONTENT_YPOS(6), - 3, 3, GADGET_ID_YAMYAM_CONTENT_6, GADGET_ID_NONE, - NULL, NULL, "7" + &level.yamyam_content[6].e[0][0], 3, 3, + NULL, NULL, "7", NULL }, { ED_AREA_YAMYAM_CONTENT_XPOS(7), ED_AREA_YAMYAM_CONTENT_YPOS(7), - 3, 3, GADGET_ID_YAMYAM_CONTENT_7, GADGET_ID_NONE, - NULL, NULL, "8" + &level.yamyam_content[7].e[0][0], 3, 3, + NULL, NULL, "8", NULL }, /* ---------- magic ball content ----------------------------------------- */ { ED_AREA_MAGIC_BALL_CONTENT_XPOS(0), ED_AREA_MAGIC_BALL_CONTENT_YPOS(0), - 3, 3, GADGET_ID_MAGIC_BALL_CONTENT_0, GADGET_ID_NONE, - NULL, NULL, "1" + &level.ball_content[0].e[0][0], 3, 3, + NULL, NULL, "1", NULL }, { ED_AREA_MAGIC_BALL_CONTENT_XPOS(1), ED_AREA_MAGIC_BALL_CONTENT_YPOS(1), - 3, 3, GADGET_ID_MAGIC_BALL_CONTENT_1, GADGET_ID_NONE, - NULL, NULL, "2" + &level.ball_content[1].e[0][0], 3, 3, + NULL, NULL, "2", NULL }, { ED_AREA_MAGIC_BALL_CONTENT_XPOS(2), ED_AREA_MAGIC_BALL_CONTENT_YPOS(2), - 3, 3, GADGET_ID_MAGIC_BALL_CONTENT_2, GADGET_ID_NONE, - NULL, NULL, "3" + &level.ball_content[2].e[0][0], 3, 3, + NULL, NULL, "3", NULL }, { ED_AREA_MAGIC_BALL_CONTENT_XPOS(3), ED_AREA_MAGIC_BALL_CONTENT_YPOS(3), - 3, 3, GADGET_ID_MAGIC_BALL_CONTENT_3, GADGET_ID_NONE, - NULL, NULL, "4" + &level.ball_content[3].e[0][0], 3, 3, + NULL, NULL, "4", NULL }, { ED_AREA_MAGIC_BALL_CONTENT_XPOS(4), ED_AREA_MAGIC_BALL_CONTENT_YPOS(4), - 3, 3, GADGET_ID_MAGIC_BALL_CONTENT_4, GADGET_ID_NONE, - NULL, NULL, "5" + &level.ball_content[4].e[0][0], 3, 3, + NULL, NULL, "5", NULL }, { ED_AREA_MAGIC_BALL_CONTENT_XPOS(5), ED_AREA_MAGIC_BALL_CONTENT_YPOS(5), - 3, 3, GADGET_ID_MAGIC_BALL_CONTENT_5, GADGET_ID_NONE, - NULL, NULL, "6" + &level.ball_content[5].e[0][0], 3, 3, + NULL, NULL, "6", NULL }, { ED_AREA_MAGIC_BALL_CONTENT_XPOS(6), ED_AREA_MAGIC_BALL_CONTENT_YPOS(6), - 3, 3, GADGET_ID_MAGIC_BALL_CONTENT_6, GADGET_ID_NONE, - NULL, NULL, "7" + &level.ball_content[6].e[0][0], 3, 3, + NULL, NULL, "7", NULL }, { ED_AREA_MAGIC_BALL_CONTENT_XPOS(7), ED_AREA_MAGIC_BALL_CONTENT_YPOS(7), - 3, 3, GADGET_ID_MAGIC_BALL_CONTENT_7, GADGET_ID_NONE, - NULL, NULL, "8" + &level.ball_content[7].e[0][0], 3, 3, + NULL, NULL, "8", NULL }, /* ---------- amoeba content --------------------------------------------- */ { ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(3), - 1, 1, GADGET_ID_AMOEBA_CONTENT, GADGET_ID_NONE, - "content:", NULL, NULL + &level.amoeba_content, 1, 1, + "content:", NULL, NULL, "amoeba content" + }, + + /* ---------- level start element ---------------------------------------- */ + + { + -1, ED_AREA_1X1_SETTINGS_YPOS(6), + GADGET_ID_START_ELEMENT, GADGET_ID_USE_START_ELEMENT, + &level.start_element[0], 1, 1, + NULL, NULL, NULL, "level start element" }, /* ---------- element settings: configure 1 (custom elements) ----------- */ @@ -2692,9 +2777,9 @@ static struct { -1, ED_AREA_1X1_SETTINGS_YPOS(1), - 1, 1, GADGET_ID_CUSTOM_GRAPHIC, GADGET_ID_CUSTOM_USE_GRAPHIC, - NULL, NULL, NULL + &custom_element.gfx_element, 1, 1, + NULL, NULL, NULL, "custom graphic element" }, /* ---------- element settings: configure 2 (custom elements) ----------- */ @@ -2703,24 +2788,24 @@ static struct { -1, ED_AREA_3X3_SETTINGS_YPOS(10), - 3, 3, GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, /* align three rows */ - "content:", NULL, NULL + &custom_element.content.e[0][0], 3, 3, + "content:", NULL, NULL, NULL }, /* ---------- custom enter and leave element (when moving) --------------- */ { ED_AREA_1X1_SETTINGS_XPOS(1), ED_AREA_1X1_SETTINGS_YPOS(3), - 1, 1, GADGET_ID_CUSTOM_MOVE_ENTER, GADGET_ID_NONE, - "can dig:", " ", NULL + &custom_element.move_enter_element, 1, 1, + "can dig:", " ", NULL, "element that can be digged/collected" }, { -1, ED_AREA_1X1_SETTINGS_YPOS(3), - 1, 1, GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, - NULL, NULL, NULL + &custom_element.move_leave_element, 1, 1, + NULL, NULL, NULL, "element that will be left behind" }, /* ---------- element settings: advanced (custom elements) --------------- */ @@ -2729,45 +2814,45 @@ static struct { -1, ED_AREA_1X1_SETTINGS_YPOS(1), - 1, 1, GADGET_ID_CUSTOM_CHANGE_TARGET, GADGET_ID_CUSTOM_CAN_CHANGE, - NULL, "after/when:", NULL + &custom_element_change.target_element, 1, 1, + NULL, "after/when:", NULL, "new target element after change" }, /* ---------- custom change content (extended change target) ------------- */ { -1, ED_AREA_3X3_SETTINGS_YPOS(10), - 3, 3, GADGET_ID_CUSTOM_CHANGE_CONTENT, GADGET_ID_NONE, /* align three rows */ - NULL, NULL, NULL + &custom_element_change.target_content.e[0][0], 3, 3, + NULL, NULL, NULL, "new extended elements after change" }, /* ---------- custom change trigger (element causing change) ------------- */ { -1, ED_AREA_1X1_SETTINGS_YPOS(5), - 1, 1, GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION, - NULL, NULL, NULL + &custom_element_change.trigger_element, 1, 1, + NULL, NULL, NULL, "other element triggering change" }, /* ---------- group element content -------------------------------------- */ { ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(4), - MAX_ELEMENTS_IN_GROUP, 1, GADGET_ID_GROUP_CONTENT, GADGET_ID_NONE, - "content:", NULL, NULL + &group_element_info.element[0], MAX_ELEMENTS_IN_GROUP, 1, + "content:", NULL, NULL, NULL }, /* ---------- random background (for random painting) -------------------- */ { -1, ED_ELEMENT_SETTINGS_YPOS(14), - 1, 1, GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED, - NULL, NULL, NULL + &random_placement_background_element, 1, 1, + NULL, NULL, NULL, "random placement background" }, }; @@ -4374,64 +4459,16 @@ static void DrawDrawingArea(int id) struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id]; int x, y; - if (id == ED_DRAWING_ID_RANDOM_BACKGROUND) - DrawMiniGraphicExt(drawto, gi->x, gi->y, - el2edimg(random_placement_background_element)); - else if (id == ED_DRAWING_ID_AMOEBA_CONTENT) - DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(level.amoeba_content)); - else if (id == ED_DRAWING_ID_CUSTOM_GRAPHIC) - DrawMiniGraphicExt(drawto, gi->x, gi->y, - el2edimg(custom_element.gfx_element)); - else if (id == ED_DRAWING_ID_CUSTOM_CONTENT) - for (y = 0; y < 3; y++) - for (x = 0; x < 3; x++) - DrawMiniGraphicExt(drawto, - gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, - 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)); - else if (id == ED_DRAWING_ID_CUSTOM_MOVE_LEAVE) - DrawMiniGraphicExt(drawto, gi->x, gi->y, - el2edimg(custom_element.move_leave_element)); - else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TARGET) - DrawMiniGraphicExt(drawto, gi->x, gi->y, - el2edimg(custom_element_change.target_element)); - else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT) - for (y = 0; y < 3; y++) - for (x = 0; x < 3; x++) - DrawMiniGraphicExt(drawto, - gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, - 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)); - else if (id == ED_DRAWING_ID_GROUP_CONTENT) - for (x = 0; x < group_element_info.num_elements; x++) - DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y, - el2edimg(group_element_info.element[x])); - else if (id >= ED_DRAWING_ID_YAMYAM_CONTENT_0 && - id <= ED_DRAWING_ID_YAMYAM_CONTENT_7) - { - int nr = id - ED_DRAWING_ID_YAMYAM_CONTENT_0; - - for (y = 0; y < 3; y++) - for (x = 0; x < 3; x++) - DrawMiniGraphicExt(drawto, - gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, - 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) - { - int nr = id - ED_DRAWING_ID_MAGIC_BALL_CONTENT_0; + int *value = drawingarea_info[id].value; + int area_xsize = drawingarea_info[id].area_xsize; + int area_ysize = drawingarea_info[id].area_ysize; - for (y = 0; y < 3; y++) - for (x = 0; x < 3; x++) - DrawMiniGraphicExt(drawto, - gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, - el2edimg(level.ball_content[nr].e[x][y])); - } + for (x = 0; x < area_xsize; x++) + for (y = 0; y < area_ysize; y++) + DrawMiniGraphicExt(drawto, + gi->x + x * MINI_TILEX, + gi->y + y * MINI_TILEY, + el2edimg(value[x * area_ysize + y])); } static void ScrollMiniLevel(int from_x, int from_y, int scroll) @@ -5535,9 +5572,8 @@ static void MapControlButtons() /* map buttons to select level */ counter_id = ED_COUNTER_ID_SELECT_LEVEL; - ModifyEditorCounterLimits(counter_id, - leveldir_current->first_level, - leveldir_current->last_level); + counterbutton_info[counter_id].min_value = leveldir_current->first_level; + counterbutton_info[counter_id].max_value = leveldir_current->last_level; MapCounterButtons(counter_id); } @@ -6230,6 +6266,8 @@ static void CopyCustomElementPropertiesToEditor(int element) custom_element_change.direct_action = (HAS_CHANGE_EVENT(element, CE_TOUCHED_BY_PLAYER) ? CE_TOUCHED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_PRESSED_BY_PLAYER) ? CE_PRESSED_BY_PLAYER : + HAS_CHANGE_EVENT(element, CE_SWITCHED_BY_PLAYER) ? CE_SWITCHED_BY_PLAYER : + HAS_CHANGE_EVENT(element, CE_SNAPPED_BY_PLAYER) ? CE_SNAPPED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_PUSHED_BY_PLAYER) ? CE_PUSHED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_ENTERED_BY_PLAYER) ? CE_ENTERED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_LEFT_BY_PLAYER) ? CE_LEFT_BY_PLAYER : @@ -6247,6 +6285,8 @@ static void CopyCustomElementPropertiesToEditor(int element) custom_element_change.other_action = (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_SWITCHES_X) ? CE_PLAYER_SWITCHES_X : + HAS_CHANGE_EVENT(element, CE_PLAYER_SNAPS_X) ? CE_PLAYER_SNAPS_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 : @@ -6259,6 +6299,7 @@ static void CopyCustomElementPropertiesToEditor(int element) 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_MOVE_OF_X) ? CE_MOVE_OF_X : HAS_CHANGE_EVENT(element, CE_VALUE_GETS_ZERO_OF_X) ? CE_VALUE_GETS_ZERO_OF_X : custom_element_change.other_action); } @@ -6364,6 +6405,8 @@ static void CopyCustomElementPropertiesToGame(int element) /* set player change event from checkbox and selectbox */ custom_element_change_events[CE_TOUCHED_BY_PLAYER] = FALSE; custom_element_change_events[CE_PRESSED_BY_PLAYER] = FALSE; + custom_element_change_events[CE_SWITCHED_BY_PLAYER] = FALSE; + custom_element_change_events[CE_SNAPPED_BY_PLAYER] = FALSE; custom_element_change_events[CE_PUSHED_BY_PLAYER] = FALSE; custom_element_change_events[CE_ENTERED_BY_PLAYER] = FALSE; custom_element_change_events[CE_LEFT_BY_PLAYER] = FALSE; @@ -6381,6 +6424,8 @@ static void CopyCustomElementPropertiesToGame(int element) /* set other element action change event from checkbox and selectbox */ custom_element_change_events[CE_PLAYER_TOUCHES_X] = FALSE; custom_element_change_events[CE_PLAYER_PRESSES_X] = FALSE; + custom_element_change_events[CE_PLAYER_SWITCHES_X] = FALSE; + custom_element_change_events[CE_PLAYER_SNAPS_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; @@ -6393,6 +6438,7 @@ static void CopyCustomElementPropertiesToGame(int element) 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_MOVE_OF_X] = FALSE; custom_element_change_events[CE_VALUE_GETS_ZERO_OF_X] = FALSE; custom_element_change_events[custom_element_change.other_action] = custom_element_change_events[CE_BY_OTHER_ACTION]; @@ -6650,6 +6696,9 @@ static void ModifyEditorDrawingArea(int drawingarea_id, int xsize, int ysize) int gadget_id = drawingarea_info[drawingarea_id].gadget_id; struct GadgetInfo *gi = level_editor_gadget[gadget_id]; + drawingarea_info[drawingarea_id].area_xsize = xsize; + drawingarea_info[drawingarea_id].area_ysize = ysize; + ModifyGadget(gi, GDI_AREA_SIZE, xsize, ysize, GDI_END); } @@ -7193,7 +7242,7 @@ static struct { EL_DYNABOMB_INCREASE_POWER, &level.score[SC_DYNAMITE],TEXT_COLLECTING }, { EL_SHIELD_NORMAL, &level.score[SC_SHIELD], TEXT_COLLECTING }, { EL_SHIELD_DEADLY, &level.score[SC_SHIELD], TEXT_COLLECTING }, - { EL_EXTRA_TIME, &level.score[SC_TIME_BONUS], TEXT_COLLECTING }, + { EL_EXTRA_TIME, &level.extra_time_score, TEXT_COLLECTING }, { EL_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING }, @@ -7334,13 +7383,27 @@ static void DrawPropertiesConfig() if (ELEM_IS_PLAYER(properties_element)) { + int player_nr = GET_PLAYER_NR(properties_element); + + /* this property can be set for every player individually */ + drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value = + &level.start_element[player_nr]; + + /* this property can be set for every player individually */ + checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value = + &level.use_start_element[player_nr]; + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID); MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ? ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD : ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DOUBLE_SPEED); + + MapDrawingArea(ED_DRAWING_ID_START_ELEMENT); } if (IS_GEM(properties_element)) @@ -7367,6 +7430,9 @@ static void DrawPropertiesConfig() if (properties_element == EL_SPRING) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_SPRING_BUG); + if (properties_element == EL_TIME_ORB_FULL) + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG); + #if 0 if (properties_element == EL_BALLOON) MapSelectboxGadget(ED_SELECTBOX_ID_WIND_DIRECTION); @@ -8421,6 +8487,9 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) } else { + int type_id = gi->custom_type_id; + int pos = sx * drawingarea_info[type_id].area_ysize + sy; + if (item_xsize == MINI_TILEX && item_ysize == MINI_TILEY) DrawMiniGraphicExt(drawto, gi->x + sx * MINI_TILEX, @@ -8432,71 +8501,19 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) gi->y + sy * TILEY, el2img(new_element), 0); - if (id == GADGET_ID_AMOEBA_CONTENT) - level.amoeba_content = new_element; - else if (id == GADGET_ID_CUSTOM_GRAPHIC) - { + if (id == GADGET_ID_CUSTOM_GRAPHIC) new_element = GFX_ELEMENT(new_element); - custom_element.gfx_element = new_element; - - CopyElementPropertiesToGame(properties_element); - - UpdateCustomElementGraphicGadgets(); - - FrameCounter = 0; /* restart animation frame counter */ - } - else if (id == GADGET_ID_CUSTOM_CONTENT) - { - custom_element.content.e[sx][sy] = new_element; - - CopyCustomElementPropertiesToGame(properties_element); - } - else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) - { - custom_element.move_enter_element = new_element; - - CopyCustomElementPropertiesToGame(properties_element); - } - else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) - { - custom_element.move_leave_element = new_element; - CopyCustomElementPropertiesToGame(properties_element); - } - else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - { - custom_element_change.target_element = new_element; + drawingarea_info[type_id].value[pos] = new_element; - CopyCustomElementPropertiesToGame(properties_element); - } - else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - { - custom_element_change.target_content.e[sx][sy] = new_element; - - CopyCustomElementPropertiesToGame(properties_element); - } - else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - { - custom_element_change.trigger_element = new_element; + CopyElementPropertiesToGame(properties_element); - CopyCustomElementPropertiesToGame(properties_element); - } - else if (id == GADGET_ID_GROUP_CONTENT) + if (id == GADGET_ID_CUSTOM_GRAPHIC) { - group_element_info.element[sx] = new_element; + UpdateCustomElementGraphicGadgets(); - CopyGroupElementPropertiesToGame(properties_element); + FrameCounter = 0; /* restart animation frame counter */ } - else if (id == GADGET_ID_RANDOM_BACKGROUND) - 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].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].e[sx][sy] = - new_element; } break; @@ -8595,39 +8612,12 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) MB_LEFTBUTTON); else if (draw_level) PickDrawingElement(button, Feld[lx][ly]); - else if (id == GADGET_ID_AMOEBA_CONTENT) - PickDrawingElement(button, level.amoeba_content); - 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.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) - PickDrawingElement(button, custom_element.move_leave_element); - else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - PickDrawingElement(button, custom_element_change.target_element); - else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - 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) - PickDrawingElement(button, group_element_info.element[sx]); - else if (id == GADGET_ID_RANDOM_BACKGROUND) - PickDrawingElement(button, random_placement_background_element); - else if (id >= GADGET_ID_YAMYAM_CONTENT_0 && - id <= GADGET_ID_YAMYAM_CONTENT_7) - { - int i = id - GADGET_ID_YAMYAM_CONTENT_0; - - 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) + else { - int i = id - GADGET_ID_MAGIC_BALL_CONTENT_0; + int type_id = gi->custom_type_id; + int pos = sx * drawingarea_info[type_id].area_ysize + sy; - PickDrawingElement(button, level.ball_content[i].e[sx][sy]); + PickDrawingElement(button, drawingarea_info[type_id].value[pos]); } break; @@ -9478,6 +9468,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) { static int start_lx, start_ly; int id = gi->custom_id; + int type_id = gi->custom_type_id; int sx = gi->event.x; int sy = gi->event.y; int lx = sx + level_xpos; @@ -9596,67 +9587,27 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) } else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) { - int element = EL_EMPTY; - - if (id == GADGET_ID_AMOEBA_CONTENT) - element = level.amoeba_content; - else if (id == GADGET_ID_CUSTOM_GRAPHIC) - element = custom_element.gfx_element; - else if (id == GADGET_ID_CUSTOM_CONTENT) - 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) - element = custom_element.move_leave_element; - 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.e[sx][sy]; - else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - element = custom_element_change.trigger_element; - else if (id == GADGET_ID_GROUP_CONTENT) - element = group_element_info.element[sx]; - else if (id == GADGET_ID_RANDOM_BACKGROUND) - 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].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].e[sx][sy]; + int pos = sx * drawingarea_info[type_id].area_ysize + sy; + int element = drawingarea_info[type_id].value[pos]; strncpy(infotext, getElementInfoText(element), max_infotext_len); } else { - if (id == GADGET_ID_AMOEBA_CONTENT) - strcpy(infotext, "Amoeba content"); - else if (id == GADGET_ID_CUSTOM_GRAPHIC) - strcpy(infotext, "Custom graphic element"); - else if (id == GADGET_ID_CUSTOM_CONTENT) - sprintf(infotext, "Custom element content position: %d, %d", sx, sy); - else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) - strcpy(infotext, "Element that can be digged/collected"); - else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) - strcpy(infotext, "Element that will be left behind"); - else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - strcpy(infotext, "New element after change"); - else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - strcpy(infotext, "New extended elements after change"); - else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - strcpy(infotext, "Other element triggering change"); + if (id == GADGET_ID_CUSTOM_CONTENT) + sprintf(infotext, "custom element content position: %d, %d", sx, sy); else if (id == GADGET_ID_GROUP_CONTENT) - sprintf(infotext, "Group element position: %d", sx + 1); - else if (id == GADGET_ID_RANDOM_BACKGROUND) - strcpy(infotext, "Random placement background"); + sprintf(infotext, "group element position: %d", sx + 1); else if (id >= GADGET_ID_YAMYAM_CONTENT_0 && id <= GADGET_ID_YAMYAM_CONTENT_7) - sprintf(infotext, "Content area %d position: %d, %d", + sprintf(infotext, "content area %d position: %d, %d", id - GADGET_ID_YAMYAM_CONTENT_0 + 1, sx, sy); else if (id >= GADGET_ID_MAGIC_BALL_CONTENT_0 && id <= GADGET_ID_MAGIC_BALL_CONTENT_7) - sprintf(infotext, "Content area %d position: %d, %d", + sprintf(infotext, "content area %d position: %d, %d", id - GADGET_ID_MAGIC_BALL_CONTENT_0 + 1, sx, sy); + else if (drawingarea_info[type_id].infotext != NULL) + strcpy(infotext, drawingarea_info[type_id].infotext); } infotext[max_infotext_len] = '\0';