X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=dd757b0560755526e7be89a91d8c4904b0e49673;hb=720b0a62c8af0585e9517ed7a98ea336304c02e4;hp=e56fa695c08339ca4117751f2ffbbba329754c0d;hpb=c145af8280c5ad22978e42621bbe5c0f3a8ada3c;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index e56fa695..dd757b05 100644 --- a/src/editor.c +++ b/src/editor.c @@ -20,6 +20,7 @@ #include "tools.h" #include "files.h" #include "game.h" +#include "init.h" #include "tape.h" @@ -119,12 +120,16 @@ ED_GADGET_DISTANCE) /* custom element content */ #define ED_AREA_ELEM_CONTENT4_XPOS (29 * MINI_TILEX) -#define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(2) + \ +#define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(12) + \ ED_GADGET_DISTANCE - MINI_TILEY) /* custom change trigger element */ -#define ED_AREA_ELEM_CONTENT5_XPOS (30 * MINI_TILEX + MINI_TILEX / 2) +#define ED_AREA_ELEM_CONTENT5_XPOS (28 * MINI_TILEX) #define ED_AREA_ELEM_CONTENT5_YPOS (ED_SETTINGS_YPOS(7) + \ ED_GADGET_DISTANCE) +/* extended custom change target */ +#define ED_AREA_ELEM_CONTENT6_XPOS (29 * MINI_TILEX) +#define ED_AREA_ELEM_CONTENT6_YPOS (ED_SETTINGS_YPOS(10) + \ + ED_GADGET_DISTANCE - MINI_TILEY) /* values for random placement background drawing area */ #define ED_AREA_RANDOM_BACKGROUND_XPOS (29 * MINI_TILEX) @@ -293,9 +298,9 @@ #define GADGET_ID_LEVEL_RANDOM_DOWN (GADGET_ID_COUNTER_FIRST + 9) #define GADGET_ID_LEVEL_RANDOM_TEXT (GADGET_ID_COUNTER_FIRST + 10) #define GADGET_ID_LEVEL_RANDOM_UP (GADGET_ID_COUNTER_FIRST + 11) -#define GADGET_ID_LEVEL_COLLECT_DOWN (GADGET_ID_COUNTER_FIRST + 12) -#define GADGET_ID_LEVEL_COLLECT_TEXT (GADGET_ID_COUNTER_FIRST + 13) -#define GADGET_ID_LEVEL_COLLECT_UP (GADGET_ID_COUNTER_FIRST + 14) +#define GADGET_ID_LEVEL_GEMSLIMIT_DOWN (GADGET_ID_COUNTER_FIRST + 12) +#define GADGET_ID_LEVEL_GEMSLIMIT_TEXT (GADGET_ID_COUNTER_FIRST + 13) +#define GADGET_ID_LEVEL_GEMSLIMIT_UP (GADGET_ID_COUNTER_FIRST + 14) #define GADGET_ID_LEVEL_TIMELIMIT_DOWN (GADGET_ID_COUNTER_FIRST + 15) #define GADGET_ID_LEVEL_TIMELIMIT_TEXT (GADGET_ID_COUNTER_FIRST + 16) #define GADGET_ID_LEVEL_TIMELIMIT_UP (GADGET_ID_COUNTER_FIRST + 17) @@ -311,27 +316,33 @@ #define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 27) #define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 28) #define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 29) -#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 30) -#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 31) -#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 32) -#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 33) -#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 34) -#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 35) -#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 36) -#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 37) -#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 38) -#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 39) -#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 40) -#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 41) -#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 42) -#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 43) -#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 44) -#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 45) -#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 46) -#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 47) +#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 30) +#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 31) +#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 32) +#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 33) +#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 34) +#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 35) +#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 36) +#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 37) +#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 38) +#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 39) +#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 40) +#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 41) +#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 42) +#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 43) +#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 44) +#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 45) +#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 46) +#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 47) +#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 48) +#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 49) +#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 50) +#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 51) +#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 52) +#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 53) /* drawing area identifiers */ -#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 48) +#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 54) #define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0) #define GADGET_ID_ELEMENT_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1) @@ -346,11 +357,12 @@ #define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 10) #define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 11) #define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 12) -#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 13) -#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 14) +#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 13) +#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 14) +#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 15) /* text input identifiers */ -#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 15) +#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 16) #define GADGET_ID_LEVEL_NAME (GADGET_ID_TEXT_INPUT_FIRST + 0) #define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1) @@ -365,14 +377,16 @@ #define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 4) #define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 5) #define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 6) -#define GADGET_ID_CUSTOM_WALKABLE_LAYER (GADGET_ID_SELECTBOX_FIRST + 7) -#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 8) -#define GADGET_ID_CHANGE_PLAYER_ACTION (GADGET_ID_SELECTBOX_FIRST + 9) -#define GADGET_ID_CHANGE_IMPACT_ACTION (GADGET_ID_SELECTBOX_FIRST + 10) -#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) +#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 7) +#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 8) +#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 9) +#define GADGET_ID_CHANGE_PLAYER_ACTION (GADGET_ID_SELECTBOX_FIRST + 10) +#define GADGET_ID_CHANGE_COLLIDE_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) +#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 13) /* textbutton identifiers */ -#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 14) #define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) #define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) @@ -416,17 +430,21 @@ #define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 14) #define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 15) #define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 16) -#define GADGET_ID_CUSTOM_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 17) +#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 17) #define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 18) #define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 19) #define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_CHANGE_BY_PLAYER (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_CHANGE_IMPACT_SMASHED (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_CHANGE_BY_OTHER (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 22) +#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 23) +#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_CHANGE_BY_PLAYER (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_CHANGE_BY_COLLISION (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_CHANGE_BY_OTHER (GADGET_ID_CHECKBUTTON_FIRST + 28) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 29) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -441,21 +459,23 @@ #define ED_COUNTER_ID_SELECT_LEVEL 0 #define ED_COUNTER_ID_LEVEL_XSIZE 1 #define ED_COUNTER_ID_LEVEL_YSIZE 2 -#define ED_COUNTER_ID_LEVEL_COLLECT 3 +#define ED_COUNTER_ID_LEVEL_GEMSLIMIT 3 #define ED_COUNTER_ID_LEVEL_TIMELIMIT 4 #define ED_COUNTER_ID_LEVEL_TIMESCORE 5 #define ED_COUNTER_ID_LEVEL_RANDOM 6 #define ED_COUNTER_ID_ELEMENT_SCORE 7 #define ED_COUNTER_ID_ELEMENT_CONTENT 8 #define ED_COUNTER_ID_CUSTOM_SCORE 9 -#define ED_COUNTER_ID_PUSH_DELAY_FIX 10 -#define ED_COUNTER_ID_PUSH_DELAY_RND 11 -#define ED_COUNTER_ID_MOVE_DELAY_FIX 12 -#define ED_COUNTER_ID_MOVE_DELAY_RND 13 -#define ED_COUNTER_ID_CHANGE_DELAY_FIX 14 -#define ED_COUNTER_ID_CHANGE_DELAY_RND 15 +#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 10 +#define ED_COUNTER_ID_PUSH_DELAY_FIX 11 +#define ED_COUNTER_ID_PUSH_DELAY_RND 12 +#define ED_COUNTER_ID_MOVE_DELAY_FIX 13 +#define ED_COUNTER_ID_MOVE_DELAY_RND 14 +#define ED_COUNTER_ID_CHANGE_DELAY_FIX 15 +#define ED_COUNTER_ID_CHANGE_DELAY_RND 16 +#define ED_COUNTER_ID_CHANGE_CONT_RND 17 -#define ED_NUM_COUNTERBUTTONS 16 +#define ED_NUM_COUNTERBUTTONS 18 #define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE #define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM @@ -464,7 +484,7 @@ #define ED_COUNTER_ID_CUSTOM_LAST ED_COUNTER_ID_MOVE_DELAY_RND #define ED_COUNTER_ID_CHANGE_FIRST ED_COUNTER_ID_CHANGE_DELAY_FIX -#define ED_COUNTER_ID_CHANGE_LAST ED_COUNTER_ID_CHANGE_DELAY_RND +#define ED_COUNTER_ID_CHANGE_LAST ED_COUNTER_ID_CHANGE_CONT_RND /* values for scrollbutton gadgets */ #define ED_SCROLLBUTTON_ID_AREA_UP 0 @@ -506,19 +526,21 @@ #define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 4 #define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 5 #define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 6 -#define ED_SELECTBOX_ID_CUSTOM_WALKABLE_LAYER 7 -#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 8 -#define ED_SELECTBOX_ID_CHANGE_PLAYER_ACTION 9 -#define ED_SELECTBOX_ID_CHANGE_IMPACT_ACTION 10 -#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 11 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 7 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 8 +#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 9 +#define ED_SELECTBOX_ID_CHANGE_PLAYER_ACTION 10 +#define ED_SELECTBOX_ID_CHANGE_COLLIDE_ACTION 11 +#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 12 +#define ED_SELECTBOX_ID_CHANGE_POWER 13 -#define ED_NUM_SELECTBOX 12 +#define ED_NUM_SELECTBOX 14 #define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION -#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_WALKABLE_LAYER +#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER #define ED_SELECTBOX_ID_CHANGE_FIRST ED_SELECTBOX_ID_CHANGE_TIME_UNITS -#define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_CHANGE_OTHER_ACTION +#define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_CHANGE_POWER /* values for textbutton gadgets */ #define ED_TEXTBUTTON_ID_PROPERTIES_INFO 0 @@ -544,22 +566,26 @@ #define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 12 #define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 13 #define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 14 -#define ED_CHECKBUTTON_ID_CUSTOM_WALKABLE 15 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 15 #define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 16 #define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 17 #define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 18 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 19 -#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER 20 -#define ED_CHECKBUTTON_ID_CHANGE_IMPACT_SMASHED 21 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER 22 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 19 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 20 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 21 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 22 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 23 +#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER 24 +#define ED_CHECKBUTTON_ID_CHANGE_BY_COLLISION 25 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER 26 -#define ED_NUM_CHECKBUTTONS 23 +#define ED_NUM_CHECKBUTTONS 27 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED #define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT -#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM_WALKABLE +#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC #define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CHANGE_BY_OTHER @@ -608,6 +634,10 @@ #define MIN_SCORE 0 #define MAX_SCORE 255 +/* values for elements with gem count */ +#define MIN_GEM_COUNT 0 +#define MAX_GEM_COUNT 100 + /* values for random placement */ #define RANDOM_USE_PERCENTAGE 0 #define RANDOM_USE_QUANTITY 1 @@ -672,6 +702,8 @@ static struct char *text_above, *text_left, *text_right; } counterbutton_info[ED_NUM_COUNTERBUTTONS] = { + /* ---------- level and editor settings ---------------------------------- */ + { DX + 5 - SX, DY + 3 - SY, 1, 100, @@ -699,8 +731,8 @@ static struct { ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(3), 0, 999, - GADGET_ID_LEVEL_COLLECT_DOWN, GADGET_ID_LEVEL_COLLECT_UP, - GADGET_ID_LEVEL_COLLECT_TEXT, + GADGET_ID_LEVEL_GEMSLIMIT_DOWN, GADGET_ID_LEVEL_GEMSLIMIT_UP, + GADGET_ID_LEVEL_GEMSLIMIT_TEXT, &level.gems_needed, "number of emeralds to collect", NULL, NULL }, @@ -728,6 +760,9 @@ static struct &random_placement_value, "random element placement", NULL, "in" }, + + /* ---------- element settings: configure (various elements) ------------- */ + { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), MIN_SCORE, MAX_SCORE, @@ -744,16 +779,27 @@ static struct &level.num_yamyam_contents, NULL, NULL, "number of content areas" }, + + /* ---------- element settings: configure (custom elements) ------------- */ + { - ED_SETTINGS_XPOS(9), ED_SETTINGS_YPOS(4), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3), MIN_SCORE, MAX_SCORE, GADGET_ID_CUSTOM_SCORE_DOWN, GADGET_ID_CUSTOM_SCORE_UP, GADGET_ID_CUSTOM_SCORE_TEXT, &custom_element.score, - NULL, "score", NULL + NULL, "collect score", NULL }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5), + ED_SETTINGS_XPOS(13) + 10, ED_SETTINGS_YPOS(3), + MIN_GEM_COUNT, MAX_GEM_COUNT, + GADGET_ID_CUSTOM_GEMCOUNT_DOWN, GADGET_ID_CUSTOM_GEMCOUNT_UP, + GADGET_ID_CUSTOM_GEMCOUNT_TEXT, + &custom_element.gem_count, + NULL, "gems", NULL + }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(4), 0, 999, GADGET_ID_PUSH_DELAY_FIX_DOWN, GADGET_ID_PUSH_DELAY_FIX_UP, GADGET_ID_PUSH_DELAY_FIX_TEXT, @@ -761,7 +807,7 @@ static struct NULL, "push delay", NULL }, { - ED_COUNT_PUSH_DELAY_RND_XPOS, ED_SETTINGS_YPOS(5), + ED_COUNT_PUSH_DELAY_RND_XPOS, ED_SETTINGS_YPOS(4), 0, 999, GADGET_ID_PUSH_DELAY_RND_DOWN, GADGET_ID_PUSH_DELAY_RND_UP, GADGET_ID_PUSH_DELAY_RND_TEXT, @@ -769,7 +815,7 @@ static struct NULL, "+random", NULL }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), 0, 999, GADGET_ID_MOVE_DELAY_FIX_DOWN, GADGET_ID_MOVE_DELAY_FIX_UP, GADGET_ID_MOVE_DELAY_FIX_TEXT, @@ -777,13 +823,16 @@ static struct NULL, "move delay", NULL }, { - ED_COUNT_MOVE_DELAY_RND_XPOS, ED_SETTINGS_YPOS(8), + ED_COUNT_MOVE_DELAY_RND_XPOS, ED_SETTINGS_YPOS(7), 0, 999, GADGET_ID_MOVE_DELAY_RND_DOWN, GADGET_ID_MOVE_DELAY_RND_UP, GADGET_ID_MOVE_DELAY_RND_TEXT, &custom_element.move_delay_random, NULL, "+random", NULL }, + + /* ---------- element settings: advanced (custom elements) --------------- */ + { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(3), 0, 999, @@ -799,7 +848,15 @@ static struct GADGET_ID_CHANGE_DELAY_RND_TEXT, &custom_element.change.delay_random, NULL, "+random", NULL - } + }, + { + ED_SETTINGS_XPOS(3), ED_SETTINGS_YPOS(12), + 0, 100, + GADGET_ID_CHANGE_CONT_RND_DOWN, GADGET_ID_CHANGE_CONT_RND_UP, + GADGET_ID_CHANGE_CONT_RND_TEXT, + &custom_element.change.random, + NULL, "use random change:", NULL + }, }; static struct @@ -827,6 +884,23 @@ static struct } }; +static struct ValueTextInfo options_access_type[] = +{ + { EP_WALKABLE, "walk" }, + { EP_PASSABLE, "pass" }, + { -1, NULL } +}; +static int value_access_type = 0; + +static struct ValueTextInfo options_access_layer[] = +{ + { EP_ACCESSIBLE_OVER, "over" }, + { EP_ACCESSIBLE_INSIDE, "inside" }, + { EP_ACCESSIBLE_UNDER, "under" }, + { -1, NULL } +}; +static int value_access_layer = 0; + static struct ValueTextInfo options_walk_to_action[] = { { EP_DIGGABLE, "diggable" }, @@ -849,6 +923,8 @@ static struct ValueTextInfo options_move_pattern[] = { MV_AWAY_FROM_PLAYER, "away from player" }, { MV_ALONG_LEFT_SIDE, "along left side" }, { MV_ALONG_RIGHT_SIDE, "along right side" }, + { MV_TURNING_LEFT, "turning left" }, + { MV_TURNING_RIGHT, "turning right" }, { -1, NULL } }; @@ -872,13 +948,14 @@ static struct ValueTextInfo options_move_stepsize[] = { -1, NULL } }; -static struct ValueTextInfo options_consistency[] = +static struct ValueTextInfo options_smash_targets[] = { - { EP_CAN_EXPLODE, "can explode" }, - { EP_INDESTRUCTIBLE, "indestructible" }, + { EP_CAN_SMASH_PLAYER, "player" }, + { EP_CAN_SMASH_ENEMIES, "enemies" }, + { EP_CAN_SMASH_EVERYTHING, "everything" }, { -1, NULL } }; -static int value_consistency = 0; +static int value_smash_targets = 0; static struct ValueTextInfo options_deadliness[] = { @@ -889,23 +966,13 @@ static struct ValueTextInfo options_deadliness[] = }; static int value_deadliness = 0; -static struct ValueTextInfo options_smash_targets[] = -{ - { EP_CAN_SMASH_PLAYER, "player" }, - { EP_CAN_SMASH_ENEMIES, "enemies" }, - { EP_CAN_SMASH_EVERYTHING, "everything" }, - { -1, NULL } -}; -static int value_smash_targets = 0; - -static struct ValueTextInfo options_walkable_layer[] = +static struct ValueTextInfo options_consistency[] = { - { EP_WALKABLE_OVER, "over" }, - { EP_WALKABLE_INSIDE, "inside" }, - { EP_WALKABLE_UNDER, "under" }, + { EP_CAN_EXPLODE, "can explode" }, + { EP_INDESTRUCTIBLE, "indestructible" }, { -1, NULL } }; -static int value_walkable_layer = 0; +static int value_consistency = 0; static struct ValueTextInfo options_time_units[] = { @@ -923,24 +990,36 @@ static struct ValueTextInfo options_change_player_action[] = }; static int value_change_player_action = 0; -static struct ValueTextInfo options_change_impact_action[] = +static struct ValueTextInfo options_change_collide_action[] = { + { CE_COLLISION, "on collision" }, { CE_IMPACT, "on impact" }, { CE_SMASHED, "when smashed" }, { -1, NULL } }; -static int value_change_impact_action = 0; +static int value_change_collide_action = 0; static struct ValueTextInfo options_change_other_action[] = { - { CE_OTHER_COLLECTING, "collecting" }, - { CE_OTHER_PUSHING, "pushing" }, - { CE_OTHER_CHANGING, "change of" }, - { CE_OTHER_EXPLODING, "explosion of" }, - { -1, NULL } + { CE_OTHER_IS_TOUCHING, "touching" }, + { CE_OTHER_IS_CHANGING, "change of" }, + { CE_OTHER_IS_EXPLODING, "explosion of" }, + { CE_OTHER_GETS_TOUCHED, "player touches" }, + { CE_OTHER_GETS_PRESSED, "player presses" }, + { CE_OTHER_GETS_PUSHED, "player pushes" }, + { CE_OTHER_GETS_COLLECTED, "player collects" }, + { -1, NULL } }; static int value_change_other_action = 0; +static struct ValueTextInfo options_change_power[] = +{ + { CP_NON_DESTRUCTIVE, "non-destructive" }, + { CP_HALF_DESTRUCTIVE, "half-destructive" }, + { CP_FULL_DESTRUCTIVE, "full-destructive" }, + { -1, NULL } +}; + static struct { int x, y; @@ -951,32 +1030,34 @@ static struct char *text_left, *text_right, *infotext; } selectbox_info[ED_NUM_SELECTBOX] = { + /* ---------- element settings: configure (custom elements) ------------- */ + { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(4), - GADGET_ID_CUSTOM_WALK_TO_ACTION, + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(1), + GADGET_ID_CUSTOM_ACCESS_TYPE, -1, - options_walk_to_action, - &value_walk_to_action, - NULL, NULL, "diggable/collectible/pushable" + options_access_type, + &value_access_type, + "player can", NULL, "type of access to this field" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(2), - GADGET_ID_CUSTOM_CONSISTENCY, + ED_SETTINGS_XPOS(11), ED_SETTINGS_YPOS(1), + GADGET_ID_CUSTOM_ACCESS_LAYER, -1, - options_consistency, - &value_consistency, - NULL, "explodes to:", "consistency/destructibility" + options_access_layer, + &value_access_layer, + NULL, NULL, "layer of access for this field" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(1), - GADGET_ID_CUSTOM_DEADLINESS, + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(2), + GADGET_ID_CUSTOM_WALK_TO_ACTION, -1, - options_deadliness, - &value_deadliness, - "deadly when", NULL, "deadliness of element" + options_walk_to_action, + &value_walk_to_action, + NULL, NULL, "diggable/collectible/pushable" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5), GADGET_ID_CUSTOM_MOVE_PATTERN, -1, options_move_pattern, @@ -984,7 +1065,7 @@ static struct "can move", NULL, "element move direction" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), GADGET_ID_CUSTOM_MOVE_DIRECTION, -1, options_move_direction, @@ -992,29 +1073,40 @@ static struct "starts moving", NULL, "initial element move direction" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_MOVE_STEPSIZE, -1, options_move_stepsize, &custom_element.move_stepsize, - "move speed", NULL, "speed of element movement" + "move/fall speed", NULL, "speed of element movement" }, { - ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(10), + ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_SMASH_TARGETS, -1, options_smash_targets, &value_smash_targets, "can smash", NULL, "elements that can be smashed" }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), + GADGET_ID_CUSTOM_DEADLINESS, + -1, + options_deadliness, + &value_deadliness, + "deadly when", NULL, "deadliness of element" + }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12), - GADGET_ID_CUSTOM_WALKABLE_LAYER, + GADGET_ID_CUSTOM_CONSISTENCY, -1, - options_walkable_layer, - &value_walkable_layer, - "player can walk", NULL, "layer where player can walk" + options_consistency, + &value_consistency, + NULL, "explodes to:", "consistency/destructibility" }, + + /* ---------- element settings: advanced (custom elements) --------------- */ + { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(4), GADGET_ID_CHANGE_TIME_UNITS, @@ -1033,10 +1125,10 @@ static struct }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(6), - GADGET_ID_CHANGE_IMPACT_ACTION, + GADGET_ID_CHANGE_COLLIDE_ACTION, -1, - options_change_impact_action, - &value_change_impact_action, + options_change_collide_action, + &value_change_collide_action, NULL, NULL, "change after impact or smash" }, { @@ -1045,7 +1137,15 @@ static struct -1, options_change_other_action, &value_change_other_action, - NULL, "other element:", "type of other element action" + NULL, "element:", "type of other element action" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(10), + GADGET_ID_CHANGE_POWER, + -1, + options_change_power, + &custom_element.change.power, + "power:", NULL, "power of extended change" }, }; @@ -1073,7 +1173,7 @@ static struct 11, "Advanced", "Advanced element configuration" }, { - ED_SETTINGS_XPOS(0) + 262, ED_SETTINGS_YPOS(12), + ED_SETTINGS_XPOS(0) + 262, ED_SETTINGS_YPOS(13), GADGET_ID_SAVE_AS_TEMPLATE, -1, "Save as template", "Save current settings as new template" }, @@ -1187,6 +1287,10 @@ static struct } }; +static boolean can_explode_by_fire = FALSE; +static boolean can_explode_smashed = FALSE; +static boolean can_explode_impact = FALSE; + static struct { int x, y; @@ -1195,6 +1299,8 @@ static struct char *text_right, *infotext; } checkbutton_info[ED_NUM_CHECKBUTTONS] = { + /* ---------- level and editor settings ---------------------------------- */ + { ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(6) - MINI_TILEY, GADGET_ID_DOUBLE_SPEED, @@ -1213,6 +1319,9 @@ static struct &random_placement_background_restricted, "restrict random placement to", "set random placement restriction" }, + + /* ---------- element settings: configure (various elements) ------------- */ + { ED_SETTINGS_XPOS(0), 0, /* set at runtime */ GADGET_ID_STICK_ELEMENT, @@ -1225,84 +1334,84 @@ static struct &level.em_slippery_gems, "slip down from certain flat walls","use EM style slipping behaviour" }, + + /* ---------- element settings: configure (custom elements) ------------- */ + { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2), - GADGET_ID_CUSTOM_EXPLODE_RESULT, - &custom_element_properties[EP_EXPLODE_RESULT], - NULL, "set consistency/destructibility" - }, - { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3), - GADGET_ID_CUSTOM_EXPLODE_FIRE, - &custom_element_properties[EP_CAN_EXPLODE_BY_FIRE], - "by fire", "element can explode by fire/explosion" - }, - { - ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(3), - GADGET_ID_CUSTOM_EXPLODE_SMASH, - &custom_element_properties[EP_CAN_EXPLODE_SMASHED], - "smashed", "element can explode when smashed" - }, - { - ED_SETTINGS_XPOS(13), ED_SETTINGS_YPOS(3), - GADGET_ID_CUSTOM_EXPLODE_IMPACT, - &custom_element_properties[EP_CAN_EXPLODE_IMPACT], - "impact", "element can explode on impact" + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1), + GADGET_ID_CUSTOM_ACCESSIBLE, + &custom_element_properties[EP_ACCESSIBLE], + NULL, "player can walk to or pass this field" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(4), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2), GADGET_ID_CUSTOM_WALK_TO_OBJECT, &custom_element_properties[EP_WALK_TO_OBJECT], NULL, "player can dig/collect/push element" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1), - GADGET_ID_CUSTOM_DEADLY, - &custom_element_properties[EP_DEADLY], - NULL, "element can kill the player" - }, - { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(6), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(5), GADGET_ID_CUSTOM_CAN_MOVE, &custom_element_properties[EP_CAN_MOVE], NULL, "element can move in some direction" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_CAN_FALL, &custom_element_properties[EP_CAN_FALL], "can fall", "element can fall down" }, { - ED_SETTINGS_XPOS(6), ED_SETTINGS_YPOS(10), + ED_SETTINGS_XPOS(6), ED_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_CAN_SMASH, &custom_element_properties[EP_CAN_SMASH], NULL, "element can smash other elements" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_SLIPPERY, &custom_element_properties[EP_SLIPPERY], "slippery", "other elements can fall down from it" }, + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11), + GADGET_ID_CUSTOM_DEADLY, + &custom_element_properties[EP_DEADLY], + NULL, "element can kill the player" + }, { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(12), - GADGET_ID_CUSTOM_WALKABLE, - &custom_element_properties[EP_WALKABLE], - NULL, "player can walk on the same field" + GADGET_ID_CUSTOM_EXPLODE_RESULT, + &custom_element_properties[EP_EXPLODE_RESULT], + NULL, "set consistency/destructibility" + }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_EXPLODE_FIRE, + &can_explode_by_fire, + "by fire", "element can explode by fire/explosion" + }, + { + ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_EXPLODE_SMASH, + &can_explode_smashed, + "smashed", "element can explode when smashed" + }, + { + ED_SETTINGS_XPOS(13), ED_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_EXPLODE_IMPACT, + &can_explode_impact, + "impact", "element can explode on impact" }, + + /* ---------- element settings: advanced (custom elements) --------------- */ + { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_USE_GRAPHIC, &custom_element.use_gfx_element, "use graphic of element:", "use graphic for custom element" }, - { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(12), - GADGET_ID_CUSTOM_USE_TEMPLATE, - &custom_element.use_template, - "use template", "use template for custom properties" - }, { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2), GADGET_ID_CUSTOM_CAN_CHANGE, @@ -1323,8 +1432,8 @@ static struct }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), - GADGET_ID_CHANGE_IMPACT_SMASHED, - &custom_element_change_events[CE_IMPACT_SMASHED], + GADGET_ID_CHANGE_BY_COLLISION, + &custom_element_change_events[CE_BY_COLLISION], NULL, "element changes by impact or smash" }, { @@ -1333,6 +1442,36 @@ static struct &custom_element_change_events[CE_BY_OTHER], NULL, "element changes by other element" }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), + GADGET_ID_CHANGE_USE_EXPLOSION, + &custom_element.change.explode, + "explode instead of change", "element explodes instead of change" + }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), + GADGET_ID_CHANGE_USE_CONTENT, + &custom_element.change.use_content, + "use extended change target:", "element changes to more elements" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(11), + GADGET_ID_CHANGE_ONLY_COMPLETE, + &custom_element.change.only_complete, + "only use complete change", "only use complete extended content" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(12), + GADGET_ID_CHANGE_USE_RANDOM, + &custom_element.change.use_random_change, + NULL, "use random value for new content" + }, + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_USE_TEMPLATE, + &level.use_custom_template, + "use template", "use template for custom properties" + }, }; @@ -2743,7 +2882,7 @@ static void CreateDrawingAreas() level_editor_gadget[id] = gi; - /* ... one areas for custom element explosion content ... */ + /* ... one area for custom element explosion content ... */ id = GADGET_ID_CUSTOM_CONTENT; gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, @@ -2782,6 +2921,26 @@ static void CreateDrawingAreas() level_editor_gadget[id] = gi; + /* ... one area for extended custom element change target content ... */ + id = GADGET_ID_CUSTOM_CHANGE_CONTENT; + gi = CreateGadget(GDI_CUSTOM_ID, id, + GDI_CUSTOM_TYPE_ID, i, + GDI_X, SX + ED_AREA_ELEM_CONTENT6_XPOS, + GDI_Y, SX + ED_AREA_ELEM_CONTENT6_YPOS, + GDI_WIDTH, 3 * MINI_TILEX, + GDI_HEIGHT, 3 * MINI_TILEY, + GDI_TYPE, GD_TYPE_DRAWING_AREA, + GDI_ITEM_SIZE, MINI_TILEX, MINI_TILEY, + GDI_EVENT_MASK, event_mask, + GDI_CALLBACK_INFO, HandleDrawingAreaInfo, + GDI_CALLBACK_ACTION, HandleDrawingAreas, + GDI_END); + + if (gi == NULL) + Error(ERR_EXIT, "cannot create gadget"); + + level_editor_gadget[id] = gi; + /* ... one for each custom element change trigger element ... */ id = GADGET_ID_CUSTOM_CHANGE_TRIGGER; gi = CreateGadget(GDI_CUSTOM_ID, id, @@ -3459,6 +3618,9 @@ static void CopyCustomElementPropertiesToEditor(int element) { int i; + /* needed here to initialize combined element properties */ + InitElementPropertiesEngine(level.game_version); + custom_element = element_info[properties_element]; for (i=0; i < NUM_ELEMENT_PROPERTIES; i++) @@ -3467,79 +3629,99 @@ static void CopyCustomElementPropertiesToEditor(int element) for (i=0; i < NUM_CHANGE_EVENTS; i++) custom_element_change_events[i] = HAS_CHANGE_EVENT(element, i); + /* ---------- element settings: configure (custom elements) ------------- */ + + /* set accessible layer selectbox help value */ + value_access_type = + (IS_WALKABLE(element) ? EP_WALKABLE : + IS_PASSABLE(element) ? EP_PASSABLE : + value_access_type); + value_access_layer = + (IS_ACCESSIBLE_OVER(element) ? EP_ACCESSIBLE_OVER : + IS_ACCESSIBLE_INSIDE(element) ? EP_ACCESSIBLE_INSIDE : + IS_ACCESSIBLE_UNDER(element) ? EP_ACCESSIBLE_UNDER : + value_access_layer); + custom_element_properties[EP_ACCESSIBLE] = + (IS_ACCESSIBLE_OVER(element) || + IS_ACCESSIBLE_INSIDE(element) || + IS_ACCESSIBLE_UNDER(element)); + /* set walk-to-object action selectbox help value */ value_walk_to_action = (IS_DIGGABLE(element) ? EP_DIGGABLE : IS_COLLECTIBLE(element) ? EP_COLLECTIBLE : IS_PUSHABLE(element) ? EP_PUSHABLE : - EP_DIGGABLE); + value_walk_to_action); custom_element_properties[EP_WALK_TO_OBJECT] = (IS_DIGGABLE(element) || IS_COLLECTIBLE(element) || IS_PUSHABLE(element)); - /* set consistency selectbox help value */ - value_consistency = - (CAN_EXPLODE(element) ? EP_CAN_EXPLODE : - IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE : - EP_CAN_EXPLODE); - custom_element_properties[EP_EXPLODE_RESULT] = - (CAN_EXPLODE(element) || - IS_INDESTRUCTIBLE(element)); + /* set smash targets selectbox help value */ + value_smash_targets = + (CAN_SMASH_EVERYTHING(element) ? EP_CAN_SMASH_EVERYTHING : + CAN_SMASH_ENEMIES(element) ? EP_CAN_SMASH_ENEMIES : + CAN_SMASH_PLAYER(element) ? EP_CAN_SMASH_PLAYER : + value_smash_targets); + custom_element_properties[EP_CAN_SMASH] = + (CAN_SMASH_EVERYTHING(element) || + CAN_SMASH_ENEMIES(element) || + CAN_SMASH_PLAYER(element)); /* set deadliness selectbox help value */ value_deadliness = (DONT_TOUCH(element) ? EP_DONT_TOUCH : DONT_COLLIDE_WITH(element) ? EP_DONT_COLLIDE_WITH : DONT_RUN_INTO(element) ? EP_DONT_RUN_INTO : - EP_DONT_RUN_INTO); + value_deadliness); custom_element_properties[EP_DEADLY] = (DONT_TOUCH(element) || DONT_COLLIDE_WITH(element) || DONT_RUN_INTO(element)); - /* set smash targets selectbox help value */ - value_smash_targets = - (CAN_SMASH_EVERYTHING(element) ? EP_CAN_SMASH_EVERYTHING : - CAN_SMASH_ENEMIES(element) ? EP_CAN_SMASH_ENEMIES : - CAN_SMASH_PLAYER(element) ? EP_CAN_SMASH_PLAYER : - EP_CAN_SMASH_PLAYER); - custom_element_properties[EP_CAN_SMASH] = - (CAN_SMASH_EVERYTHING(element) || - CAN_SMASH_ENEMIES(element) || - CAN_SMASH_PLAYER(element)); + /* set consistency selectbox help value */ + value_consistency = + (IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE : + CAN_EXPLODE(element) ? EP_CAN_EXPLODE : + value_consistency); + custom_element_properties[EP_EXPLODE_RESULT] = + (IS_INDESTRUCTIBLE(element) || + CAN_EXPLODE(element)); + + /* special case: sub-settings dependent from main setting */ + if (CAN_EXPLODE(element)) + { + can_explode_by_fire = CAN_EXPLODE_BY_FIRE(element); + can_explode_smashed = CAN_EXPLODE_SMASHED(element); + can_explode_impact = CAN_EXPLODE_IMPACT(element); + }; - /* set walkable layer selectbox help value */ - value_walkable_layer = - (IS_WALKABLE_OVER(element) ? EP_WALKABLE_OVER : - IS_WALKABLE_INSIDE(element) ? EP_WALKABLE_INSIDE : - IS_WALKABLE_UNDER(element) ? EP_WALKABLE_UNDER : - EP_WALKABLE_OVER); - custom_element_properties[EP_WALKABLE] = - (IS_WALKABLE_OVER(element) || - IS_WALKABLE_INSIDE(element) || - IS_WALKABLE_UNDER(element)); + /* ---------- element settings: advanced (custom elements) --------------- */ /* set change by player selectbox help value */ value_change_player_action = (HAS_CHANGE_EVENT(element, CE_PUSHED_BY_PLAYER) ? CE_PUSHED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_PRESSED_BY_PLAYER) ? CE_PRESSED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_TOUCHED_BY_PLAYER) ? CE_TOUCHED_BY_PLAYER : - CE_PRESSED_BY_PLAYER); + value_change_player_action); - /* set change by impact/smash selectbox help value */ - value_change_impact_action = + /* set change by collision selectbox help value */ + value_change_collide_action = (HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED : HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT : - CE_IMPACT); + HAS_CHANGE_EVENT(element, CE_COLLISION) ? CE_COLLISION : + value_change_collide_action); /* set change by other element action selectbox help value */ value_change_other_action = - (HAS_CHANGE_EVENT(element, CE_OTHER_EXPLODING) ? CE_OTHER_EXPLODING : - HAS_CHANGE_EVENT(element, CE_OTHER_CHANGING) ? CE_OTHER_CHANGING : - HAS_CHANGE_EVENT(element, CE_OTHER_PUSHING) ? CE_OTHER_PUSHING : - HAS_CHANGE_EVENT(element, CE_OTHER_COLLECTING) ? CE_OTHER_COLLECTING : - CE_OTHER_COLLECTING); + (HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED : + HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PUSHED) ? CE_OTHER_GETS_PUSHED : + HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PRESSED) ? CE_OTHER_GETS_PRESSED : + HAS_CHANGE_EVENT(element, CE_OTHER_GETS_TOUCHED) ? CE_OTHER_GETS_TOUCHED : + HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING : + HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING : + HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING : + value_change_other_action); } static void CopyCustomElementPropertiesToGame(int element) @@ -3548,6 +3730,20 @@ static void CopyCustomElementPropertiesToGame(int element) element_info[properties_element] = custom_element; + /* ---------- element settings: configure (custom elements) ------------- */ + + /* set accessible property from checkbox and selectbox */ + custom_element_properties[EP_WALKABLE_OVER] = FALSE; + custom_element_properties[EP_WALKABLE_INSIDE] = FALSE; + custom_element_properties[EP_WALKABLE_UNDER] = FALSE; + custom_element_properties[EP_PASSABLE_OVER] = FALSE; + custom_element_properties[EP_PASSABLE_INSIDE] = FALSE; + custom_element_properties[EP_PASSABLE_UNDER] = FALSE; + custom_element_properties[((value_access_type == EP_WALKABLE ? + EP_WALKABLE_OVER : EP_PASSABLE_OVER) + + (value_access_layer - EP_ACCESSIBLE_OVER))] = + custom_element_properties[EP_ACCESSIBLE]; + /* set walk-to-object property from checkbox and selectbox */ custom_element_properties[EP_DIGGABLE] = FALSE; custom_element_properties[EP_COLLECTIBLE] = FALSE; @@ -3555,11 +3751,12 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_properties[value_walk_to_action] = custom_element_properties[EP_WALK_TO_OBJECT]; - /* set consistency property from checkbox and selectbox */ - custom_element_properties[EP_CAN_EXPLODE] = FALSE; - custom_element_properties[EP_INDESTRUCTIBLE] = FALSE; - custom_element_properties[value_consistency] = - custom_element_properties[EP_EXPLODE_RESULT]; + /* set smash property from checkbox and selectbox */ + custom_element_properties[EP_CAN_SMASH_PLAYER] = FALSE; + custom_element_properties[EP_CAN_SMASH_ENEMIES] = FALSE; + custom_element_properties[EP_CAN_SMASH_EVERYTHING] = FALSE; + custom_element_properties[value_smash_targets] = + custom_element_properties[EP_CAN_SMASH]; /* set deadliness property from checkbox and selectbox */ custom_element_properties[EP_DONT_RUN_INTO] = FALSE; @@ -3568,19 +3765,24 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_properties[value_deadliness] = custom_element_properties[EP_DEADLY]; - /* set smash property from checkbox and selectbox */ - custom_element_properties[EP_CAN_SMASH_PLAYER] = FALSE; - custom_element_properties[EP_CAN_SMASH_ENEMIES] = FALSE; - custom_element_properties[EP_CAN_SMASH_EVERYTHING] = FALSE; - custom_element_properties[value_smash_targets] = - custom_element_properties[EP_CAN_SMASH]; + /* set consistency property from checkbox and selectbox */ + custom_element_properties[EP_INDESTRUCTIBLE] = FALSE; + custom_element_properties[EP_CAN_EXPLODE] = 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[value_consistency] = + custom_element_properties[EP_EXPLODE_RESULT]; - /* set walkable property from checkbox and selectbox */ - custom_element_properties[EP_WALKABLE_OVER] = FALSE; - custom_element_properties[EP_WALKABLE_INSIDE] = FALSE; - custom_element_properties[EP_WALKABLE_UNDER] = FALSE; - custom_element_properties[value_walkable_layer] = - custom_element_properties[EP_WALKABLE]; + /* special case: sub-settings dependent from main setting */ + if (custom_element_properties[EP_CAN_EXPLODE]) + { + custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = can_explode_by_fire; + custom_element_properties[EP_CAN_EXPLODE_SMASHED] = can_explode_smashed; + custom_element_properties[EP_CAN_EXPLODE_IMPACT] = can_explode_impact; + } + + /* ---------- element settings: advanced (custom elements) --------------- */ /* set player change event from checkbox and selectbox */ custom_element_change_events[CE_TOUCHED_BY_PLAYER] = FALSE; @@ -3589,17 +3791,21 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_change_events[value_change_player_action] = custom_element_change_events[CE_BY_PLAYER]; - /* set player change event from checkbox and selectbox */ + /* set collision change event from checkbox and selectbox */ + custom_element_change_events[CE_COLLISION] = FALSE; custom_element_change_events[CE_IMPACT] = FALSE; custom_element_change_events[CE_SMASHED] = FALSE; - custom_element_change_events[value_change_impact_action] = - custom_element_change_events[CE_IMPACT_SMASHED]; + custom_element_change_events[value_change_collide_action] = + custom_element_change_events[CE_BY_COLLISION]; /* set other element action change event from checkbox and selectbox */ - custom_element_change_events[CE_OTHER_COLLECTING] = FALSE; - custom_element_change_events[CE_OTHER_PUSHING] = FALSE; - custom_element_change_events[CE_OTHER_CHANGING] = FALSE; - custom_element_change_events[CE_OTHER_EXPLODING] = FALSE; + custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE; + custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE; + custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE; + 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_COLLECTED] = FALSE; custom_element_change_events[value_change_other_action] = custom_element_change_events[CE_BY_OTHER]; @@ -3661,6 +3867,7 @@ void DrawLevelEd() redraw_mask |= REDRAW_ALL; ReinitializeElementListButtons(); /* only needed after setup changes */ + ModifyEditorElementList(); /* may be needed for custom elements */ UnmapTapeButtons(); MapControlButtons(); @@ -4038,11 +4245,36 @@ static void DrawCustomChangeTargetArea() DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); DrawMiniGraphicExt(drawto, gi->x, gi->y, - el2edimg(custom_element.change.successor)); + el2edimg(custom_element.change.target_element)); MapDrawingArea(GADGET_ID_CUSTOM_CHANGE_TARGET); } +static void DrawCustomChangeContentArea() +{ + struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGE_CONTENT]; + int area_sx = SX + ED_AREA_ELEM_CONTENT6_XPOS; + int area_sy = SY + ED_AREA_ELEM_CONTENT6_YPOS; + int x, y; + + if (!IS_CUSTOM_ELEMENT(properties_element)) + { + /* this should never happen */ + Error(ERR_WARN, "element %d is no custom element", properties_element); + + return; + } + + DrawElementBorder(area_sx, area_sy, 3 * MINI_TILEX, 3 * MINI_TILEY, TRUE); + + 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.content[x][y])); + + MapDrawingArea(GADGET_ID_CUSTOM_CHANGE_CONTENT); +} + static void DrawCustomChangeTriggerArea() { struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGE_TRIGGER]; @@ -4061,7 +4293,7 @@ static void DrawCustomChangeTriggerArea() DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); DrawMiniGraphicExt(drawto, gi->x, gi->y, - el2edimg(custom_element.change.trigger)); + el2edimg(custom_element.change.trigger_element)); MapDrawingArea(GADGET_ID_CUSTOM_CHANGE_TRIGGER); } @@ -4600,6 +4832,16 @@ static void DrawPropertiesConfig() } } +static void DrawPropertiesAdvancedDrawingAreas() +{ + DrawCustomGraphicElementArea(); + DrawCustomChangeTargetArea(); + DrawCustomChangeTriggerArea(); + DrawCustomChangeContentArea(); + + redraw_mask |= REDRAW_FIELD; +} + static void DrawPropertiesAdvanced() { int i; @@ -4626,9 +4868,7 @@ static void DrawPropertiesAdvanced() MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE); /* draw drawing area gadgets */ - DrawCustomGraphicElementArea(); - DrawCustomChangeTargetArea(); - DrawCustomChangeTriggerArea(); + DrawPropertiesAdvancedDrawingAreas(); } static void DrawElementName(int x, int y, int element) @@ -5392,6 +5632,10 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) (draw_level || drawing_function == GADGET_ID_PICK_ELEMENT ? drawing_function : GADGET_ID_SINGLE_ITEMS); + /* clicking into drawing area with pressed Control key picks element */ + if (GetKeyModState() & KMOD_Control) + actual_drawing_function = GADGET_ID_PICK_ELEMENT; + switch (actual_drawing_function) { case GADGET_ID_SINGLE_ITEMS: @@ -5472,12 +5716,17 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) } else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) { - custom_element.change.successor = new_element; + custom_element.change.target_element = new_element; + element_info[properties_element] = custom_element; + } + else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) + { + custom_element.change.content[sx][sy] = new_element; element_info[properties_element] = custom_element; } else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) { - custom_element.change.trigger = new_element; + custom_element.change.trigger_element = new_element; element_info[properties_element] = custom_element; } else if (id == GADGET_ID_RANDOM_BACKGROUND) @@ -5591,9 +5840,11 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) else if (id == GADGET_ID_CUSTOM_CONTENT) PickDrawingElement(button, custom_element.content[sx][sy]); else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - PickDrawingElement(button, custom_element.change.successor); + PickDrawingElement(button, custom_element.change.target_element); + else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) + PickDrawingElement(button, custom_element.change.content[sx][sy]); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - PickDrawingElement(button, custom_element.change.trigger); + PickDrawingElement(button, custom_element.change.trigger_element); else if (id == GADGET_ID_RANDOM_BACKGROUND) PickDrawingElement(button, random_placement_background_element); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && @@ -5725,6 +5976,8 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) { ModifyEditorElementList(); RedrawDrawingElements(); + + DrawPropertiesAdvancedDrawingAreas(); } } @@ -5741,7 +5994,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (id < ED_NUM_CTRL1_BUTTONS && id != GADGET_ID_PROPERTIES && id != GADGET_ID_PICK_ELEMENT && edit_mode != ED_MODE_DRAWING && - drawing_function != GADGET_ID_PICK_ELEMENT) + drawing_function != GADGET_ID_PICK_ELEMENT && + !(GetKeyModState() & KMOD_Control)) { DrawDrawingWindow(); edit_mode = ED_MODE_DRAWING; @@ -6022,7 +6276,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) PickDrawingElement(button, new_element); if (!stick_element_properties_window && - drawing_function != GADGET_ID_PICK_ELEMENT) + drawing_function != GADGET_ID_PICK_ELEMENT && + !(GetKeyModState() & KMOD_Control)) { properties_element = new_element; if (edit_mode == ED_MODE_PROPERTIES) @@ -6182,7 +6437,9 @@ void HandleEditorGadgetInfoText(void *ptr) { if (gi->custom_id == GADGET_ID_SINGLE_ITEMS) /* special case 1 */ sprintf(shortcut, " ('.' or '%c')", key); - else if (gi->custom_id == GADGET_ID_TEST) /* special case 2 */ + else if (gi->custom_id == GADGET_ID_PICK_ELEMENT) /* special case 2 */ + sprintf(shortcut, " ('%c' or 'Ctrl')", key); + else if (gi->custom_id == GADGET_ID_TEST) /* special case 3 */ sprintf(shortcut, " ('Enter' or 'Shift-%c')", key); else /* normal case */ sprintf(shortcut, " ('%s%c')", @@ -6208,6 +6465,11 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) int min_sx = 0, min_sy = 0; int max_sx = gi->drawing.area_xsize - 1; int max_sy = gi->drawing.area_ysize - 1; + int actual_drawing_function = drawing_function; + + /* pressed Control key: simulate picking element */ + if (GetKeyModState() & KMOD_Control) + actual_drawing_function = GADGET_ID_PICK_ELEMENT; ClearEditorGadgetInfoText(); @@ -6248,7 +6510,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) start_ly = ly; } - switch (drawing_function) + switch (actual_drawing_function) { case GADGET_ID_SINGLE_ITEMS: infotext = "Drawing single items"; @@ -6286,7 +6548,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) break; } - if (drawing_function == GADGET_ID_PICK_ELEMENT) + 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 @@ -6294,7 +6556,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) "%s: %d, %d", infotext, ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1); } - else if (drawing_function == GADGET_ID_PICK_ELEMENT) + 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 @@ -6311,33 +6573,36 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) DeleteBrushFromCursor(); } } - else if (drawing_function == GADGET_ID_PICK_ELEMENT) + else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) { if (id == GADGET_ID_AMOEBA_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(level.amoeba_content)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(level.amoeba_content)); else if (id == GADGET_ID_CUSTOM_GRAPHIC) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(custom_element.use_gfx_element)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.gfx_element)); else if (id == GADGET_ID_CUSTOM_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(custom_element.content[sx][sy])); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.content[sx][sy])); else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(custom_element.change.successor)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.change.target_element)); + else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.change.content[sx][sy])); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(custom_element.change.trigger)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.change.trigger_element)); else if (id == GADGET_ID_RANDOM_BACKGROUND) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(random_placement_background_element)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(random_placement_background_element)); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && id <= GADGET_ID_ELEMENT_CONTENT_7) { int i = id - GADGET_ID_ELEMENT_CONTENT_0; - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(level.yamyam_content[i][sx][sy])); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(level.yamyam_content[i][sx][sy])); } } else @@ -6354,6 +6619,9 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "New element after change"); + else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, + "New extended elements after change"); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "Other element triggering change");