X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=87184cd88820a0be03ce083009a8f5b696f79bbe;hb=ddaae9de458b7f07b05461101655a1da4c63b380;hp=e56fa695c08339ca4117751f2ffbbba329754c0d;hpb=c145af8280c5ad22978e42621bbe5c0f3a8ada3c;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index e56fa695..87184cd8 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" @@ -69,7 +70,9 @@ /* standard distances */ #define ED_BORDER_SIZE 3 -#define ED_BORDER2_SIZE 5 +#define ED_BORDER_TEXT_XSIZE 5 +#define ED_BORDER_AREA_YSIZE 1 + #define ED_GADGET_DISTANCE 2 #define ED_GADGET_TEXT_DISTANCE (2 * ED_GADGET_DISTANCE) @@ -109,6 +112,12 @@ #define ED_AREA_ELEM_CONTENT_XPOS ( 2 * MINI_TILEX) #define ED_AREA_ELEM_CONTENT_YPOS (22 * MINI_TILEY) +/* yamyam content */ +#define ED_AREA_YAMYAM_CONTENT_XPOS(n) (ED_AREA_ELEM_CONTENT_XPOS + \ + 5 * (n % 4) * MINI_TILEX) +#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (ED_AREA_ELEM_CONTENT_YPOS + \ + 6 * (n / 4) * MINI_TILEY) + /* custom change target */ #define ED_AREA_ELEM_CONTENT2_XPOS (20 * MINI_TILEX) #define ED_AREA_ELEM_CONTENT2_YPOS (ED_SETTINGS_YPOS(2) + \ @@ -119,12 +128,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) @@ -224,6 +237,8 @@ #define ED_SELECTBOX_XSIZE ED_WIN_COUNT_XSIZE #define ED_SELECTBOX_YSIZE ED_WIN_COUNT_YSIZE +#define ED_SELECTBOX_BUTTON_XSIZE 14 + #define ED_TEXTBUTTON_XPOS ED_WIN_COUNT_XPOS #define ED_TEXTBUTTON_YPOS (ED_WIN_COUNT_YPOS + \ 4 * (2 + ED_WIN_COUNT_YSIZE)) @@ -293,9 +308,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 +326,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,17 +367,19 @@ #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) +#define GADGET_ID_ELEMENT_NAME (GADGET_ID_TEXT_INPUT_FIRST + 2) /* selectbox identifiers */ -#define GADGET_ID_SELECTBOX_FIRST (GADGET_ID_TEXT_INPUT_FIRST + 2) +#define GADGET_ID_SELECTBOX_FIRST (GADGET_ID_TEXT_INPUT_FIRST + 3) #define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 0) #define GADGET_ID_CUSTOM_CONSISTENCY (GADGET_ID_SELECTBOX_FIRST + 1) @@ -365,14 +388,17 @@ #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_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 7) +#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 8) +#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 9) +#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 10) +#define GADGET_ID_CHANGE_PLAYER_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) +#define GADGET_ID_CHANGE_COLLIDE_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 13) +#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 14) /* textbutton identifiers */ -#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 15) #define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) #define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) @@ -416,17 +442,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 +471,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 +496,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 @@ -492,33 +524,37 @@ /* values for text input gadgets */ #define ED_TEXTINPUT_ID_LEVEL_NAME 0 #define ED_TEXTINPUT_ID_LEVEL_AUTHOR 1 +#define ED_TEXTINPUT_ID_ELEMENT_NAME 2 -#define ED_NUM_TEXTINPUT 2 +#define ED_NUM_TEXTINPUT 3 #define ED_TEXTINPUT_ID_LEVEL_FIRST ED_TEXTINPUT_ID_LEVEL_NAME #define ED_TEXTINPUT_ID_LEVEL_LAST ED_TEXTINPUT_ID_LEVEL_AUTHOR /* values for selectbox gadgets */ -#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 0 -#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 1 -#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 2 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 0 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 1 +#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 2 #define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 3 #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_SLIPPERY_TYPE 7 +#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 8 +#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 9 +#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 10 +#define ED_SELECTBOX_ID_CHANGE_PLAYER_ACTION 11 +#define ED_SELECTBOX_ID_CHANGE_COLLIDE_ACTION 12 +#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 13 +#define ED_SELECTBOX_ID_CHANGE_POWER 14 -#define ED_NUM_SELECTBOX 12 +#define ED_NUM_SELECTBOX 15 -#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_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE +#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_CONSISTENCY #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 @@ -534,35 +570,39 @@ #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 2 #define ED_CHECKBUTTON_ID_STICK_ELEMENT 3 #define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 4 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 5 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 6 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 7 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 8 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 9 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 10 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 11 -#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 5 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 6 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 7 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 8 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 9 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 10 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 11 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 12 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 13 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 14 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 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_NUM_CHECKBUTTONS 23 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 17 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 18 +#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER 19 +#define ED_CHECKBUTTON_ID_CHANGE_BY_COLLISION 20 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER 21 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 22 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 23 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 24 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 25 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 26 + +#define ED_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_FIRST ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE +#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC -#define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CHANGE_BY_OTHER +#define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE /* values for radiobutton gadgets */ #define ED_RADIOBUTTON_ID_PERCENTAGE 0 @@ -573,6 +613,26 @@ #define ED_RADIOBUTTON_ID_LEVEL_FIRST ED_RADIOBUTTON_ID_PERCENTAGE #define ED_RADIOBUTTON_ID_LEVEL_LAST ED_RADIOBUTTON_ID_QUANTITY +/* values for drawing area gadgets */ +#define ED_DRAWING_ID_DRAWING_LEVEL 0 +#define ED_DRAWING_ID_ELEMENT_CONTENT_0 1 +#define ED_DRAWING_ID_ELEMENT_CONTENT_1 2 +#define ED_DRAWING_ID_ELEMENT_CONTENT_2 3 +#define ED_DRAWING_ID_ELEMENT_CONTENT_3 4 +#define ED_DRAWING_ID_ELEMENT_CONTENT_4 5 +#define ED_DRAWING_ID_ELEMENT_CONTENT_5 6 +#define ED_DRAWING_ID_ELEMENT_CONTENT_6 7 +#define ED_DRAWING_ID_ELEMENT_CONTENT_7 8 +#define ED_DRAWING_ID_AMOEBA_CONTENT 9 +#define ED_DRAWING_ID_CUSTOM_GRAPHIC 10 +#define ED_DRAWING_ID_CUSTOM_CONTENT 11 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 12 +#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 13 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 14 +#define ED_DRAWING_ID_RANDOM_BACKGROUND 15 + +#define ED_NUM_DRAWING_AREAS 16 + /* ----------------------------------------------------------------------------- @@ -608,6 +668,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 @@ -668,15 +732,18 @@ static struct int min_value, max_value; int gadget_id_down, gadget_id_up; int gadget_id_text; + int gadget_id_align; int *value; char *text_above, *text_left, *text_right; } counterbutton_info[ED_NUM_COUNTERBUTTONS] = { + /* ---------- level and editor settings ---------------------------------- */ + { DX + 5 - SX, DY + 3 - SY, 1, 100, GADGET_ID_SELECT_LEVEL_DOWN, GADGET_ID_SELECT_LEVEL_UP, - GADGET_ID_SELECT_LEVEL_TEXT, + GADGET_ID_SELECT_LEVEL_TEXT, GADGET_ID_NONE, &level_nr, NULL, NULL, NULL }, @@ -684,55 +751,58 @@ static struct ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(2), MIN_LEV_FIELDX, MAX_LEV_FIELDX, GADGET_ID_LEVEL_XSIZE_DOWN, GADGET_ID_LEVEL_XSIZE_UP, - GADGET_ID_LEVEL_XSIZE_TEXT, + GADGET_ID_LEVEL_XSIZE_TEXT, GADGET_ID_NONE, &level.fieldx, - "playfield size", NULL, "width", + "playfield size:", NULL, "width", }, { ED_SETTINGS_XPOS(0) + 2 * DXSIZE, ED_COUNTER_YPOS(2), MIN_LEV_FIELDY, MAX_LEV_FIELDY, GADGET_ID_LEVEL_YSIZE_DOWN, GADGET_ID_LEVEL_YSIZE_UP, - GADGET_ID_LEVEL_YSIZE_TEXT, + GADGET_ID_LEVEL_YSIZE_TEXT, GADGET_ID_LEVEL_XSIZE_UP, &level.fieldy, - NULL, NULL, "height", + NULL, " ", "height", }, { 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, GADGET_ID_NONE, &level.gems_needed, - "number of emeralds to collect", NULL, NULL + "number of emeralds to collect:", NULL, NULL }, { ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4), 0, 999, GADGET_ID_LEVEL_TIMELIMIT_DOWN, GADGET_ID_LEVEL_TIMELIMIT_UP, - GADGET_ID_LEVEL_TIMELIMIT_TEXT, + GADGET_ID_LEVEL_TIMELIMIT_TEXT, GADGET_ID_NONE, &level.time, - "time available to solve level", NULL, "(0 => no time limit)" + "time available to solve level:", NULL, "(0 => no time limit)" }, { ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(5), 0, 255, GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP, - GADGET_ID_LEVEL_TIMESCORE_TEXT, + GADGET_ID_LEVEL_TIMESCORE_TEXT, GADGET_ID_NONE, &level.score[SC_TIME_BONUS], - "score for each 10 seconds left", NULL, NULL + "score for each 10 seconds left:", NULL, NULL }, { ED_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(8), 1, 100, GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP, - GADGET_ID_LEVEL_RANDOM_TEXT, + GADGET_ID_LEVEL_RANDOM_TEXT, GADGET_ID_NONE, &random_placement_value, - "random element placement", NULL, "in" + "random element placement:", NULL, "in" }, + + /* ---------- element settings: configure (various elements) ------------- */ + { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), MIN_SCORE, MAX_SCORE, GADGET_ID_ELEMENT_SCORE_DOWN, GADGET_ID_ELEMENT_SCORE_UP, - GADGET_ID_ELEMENT_SCORE_TEXT, + GADGET_ID_ELEMENT_SCORE_TEXT, GADGET_ID_NONE, NULL, /* will be set when used */ NULL, NULL, NULL }, @@ -740,66 +810,88 @@ static struct ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(6), MIN_ELEMENT_CONTENTS, MAX_ELEMENT_CONTENTS, GADGET_ID_ELEMENT_CONTENT_DOWN, GADGET_ID_ELEMENT_CONTENT_UP, - GADGET_ID_ELEMENT_CONTENT_TEXT, + GADGET_ID_ELEMENT_CONTENT_TEXT, GADGET_ID_NONE, &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, + GADGET_ID_CUSTOM_SCORE_TEXT, GADGET_ID_NONE, &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, GADGET_ID_CUSTOM_SCORE_UP, + &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, + GADGET_ID_PUSH_DELAY_FIX_TEXT, GADGET_ID_NONE, &custom_element.push_delay_fixed, 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, + GADGET_ID_PUSH_DELAY_RND_TEXT, GADGET_ID_PUSH_DELAY_FIX_UP, &custom_element.push_delay_random, 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, + GADGET_ID_MOVE_DELAY_FIX_TEXT, GADGET_ID_NONE, &custom_element.move_delay_fixed, 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, + GADGET_ID_MOVE_DELAY_RND_TEXT, GADGET_ID_MOVE_DELAY_FIX_UP, &custom_element.move_delay_random, NULL, "+random", NULL }, + + /* ---------- element settings: advanced (custom elements) --------------- */ + { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(3), 0, 999, GADGET_ID_CHANGE_DELAY_FIX_DOWN, GADGET_ID_CHANGE_DELAY_FIX_UP, - GADGET_ID_CHANGE_DELAY_FIX_TEXT, + GADGET_ID_CHANGE_DELAY_FIX_TEXT, GADGET_ID_NONE, &custom_element.change.delay_fixed, NULL, "delay", NULL, }, { - ED_COUNT_CHANGE_DELAY_RND_XPOS, ED_SETTINGS_YPOS(3), + ED_COUNT_CHANGE_DELAY_RND_XPOS+20, ED_SETTINGS_YPOS(3), 0, 999, GADGET_ID_CHANGE_DELAY_RND_DOWN, GADGET_ID_CHANGE_DELAY_RND_UP, - GADGET_ID_CHANGE_DELAY_RND_TEXT, + GADGET_ID_CHANGE_DELAY_RND_TEXT, GADGET_ID_CHANGE_DELAY_FIX_UP, &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, GADGET_ID_NONE, + &custom_element.change.random, + NULL, "use random change:", "(%)" + }, }; static struct @@ -824,9 +916,31 @@ static struct MAX_LEVEL_AUTHOR_LEN, level.author, "Author" + }, + { + 5 * MINI_TILEX, 5 * MINI_TILEY - ED_BORDER_SIZE, + GADGET_ID_ELEMENT_NAME, + MAX_ELEMENT_NAME_LEN - 2, /* currently 2 chars less editable */ + custom_element.description, + NULL } }; +static struct ValueTextInfo options_access_type[] = +{ + { EP_WALKABLE, "walk" }, + { EP_PASSABLE, "pass" }, + { -1, NULL } +}; + +static struct ValueTextInfo options_access_layer[] = +{ + { EP_ACCESSIBLE_OVER, "over" }, + { EP_ACCESSIBLE_INSIDE, "inside" }, + { EP_ACCESSIBLE_UNDER, "under" }, + { -1, NULL } +}; + static struct ValueTextInfo options_walk_to_action[] = { { EP_DIGGABLE, "diggable" }, @@ -834,7 +948,6 @@ static struct ValueTextInfo options_walk_to_action[] = { EP_PUSHABLE, "pushable" }, { -1, NULL } }; -static int value_walk_to_action = 0; static struct ValueTextInfo options_move_pattern[] = { @@ -849,6 +962,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,40 +987,40 @@ 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" }, +#if 0 + { EP_CAN_SMASH_ENEMIES, "enemies" }, +#endif + { EP_CAN_SMASH_EVERYTHING, "everything" }, { -1, NULL } }; -static int value_consistency = 0; -static struct ValueTextInfo options_deadliness[] = +static struct ValueTextInfo options_slippery_type[] = { - { EP_DONT_RUN_INTO, "running into" }, - { EP_DONT_COLLIDE_WITH, "colliding with" }, - { EP_DONT_TOUCH, "touching" }, + { SLIPPERY_ANY_RANDOM, "random" }, + { SLIPPERY_ANY_LEFT_RIGHT, "left, right" }, + { SLIPPERY_ANY_RIGHT_LEFT, "right, left" }, + { SLIPPERY_ONLY_LEFT, "only left" }, + { SLIPPERY_ONLY_RIGHT, "only right" }, { -1, NULL } }; -static int value_deadliness = 0; -static struct ValueTextInfo options_smash_targets[] = +static struct ValueTextInfo options_deadliness[] = { - { EP_CAN_SMASH_PLAYER, "player" }, - { EP_CAN_SMASH_ENEMIES, "enemies" }, - { EP_CAN_SMASH_EVERYTHING, "everything" }, + { EP_DONT_RUN_INTO, "running into" }, + { EP_DONT_COLLIDE_WITH, "colliding with" }, + { EP_DONT_TOUCH, "touching" }, { -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 struct ValueTextInfo options_time_units[] = { @@ -921,103 +1036,134 @@ static struct ValueTextInfo options_change_player_action[] = { CE_PUSHED_BY_PLAYER, "pushed" }, { -1, NULL } }; -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 struct ValueTextInfo options_change_other_action[] = { - { CE_OTHER_COLLECTING, "collecting" }, - { CE_OTHER_PUSHING, "pushing" }, - { CE_OTHER_CHANGING, "change of" }, - { CE_OTHER_EXPLODING, "explosion of" }, + { 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 struct ValueTextInfo options_change_power[] = +{ + { CP_NON_DESTRUCTIVE, "non-destructive" }, + { CP_HALF_DESTRUCTIVE, "half-destructive" }, + { CP_FULL_DESTRUCTIVE, "full-destructive" }, { -1, NULL } }; -static int value_change_other_action = 0; static struct { int x, y; int gadget_id; + int gadget_id_align; int size; /* char size of selectbox or '-1' (dynamically determined) */ struct ValueTextInfo *options; int *value; 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, GADGET_ID_NONE, -1, - options_walk_to_action, - &value_walk_to_action, - NULL, NULL, "diggable/collectible/pushable" + options_access_type, + &custom_element.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, GADGET_ID_CUSTOM_ACCESS_TYPE, -1, - options_consistency, - &value_consistency, - NULL, "explodes to:", "consistency/destructibility" + options_access_layer, + &custom_element.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, GADGET_ID_NONE, -1, - options_deadliness, - &value_deadliness, - "deadly when", NULL, "deadliness of element" + options_walk_to_action, + &custom_element.walk_to_action, + NULL, NULL, "diggable/collectible/pushable" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), - GADGET_ID_CUSTOM_MOVE_PATTERN, + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5), + GADGET_ID_CUSTOM_MOVE_PATTERN, GADGET_ID_NONE, -1, options_move_pattern, &custom_element.move_pattern, "can move", NULL, "element move direction" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), - GADGET_ID_CUSTOM_MOVE_DIRECTION, + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), + GADGET_ID_CUSTOM_MOVE_DIRECTION, GADGET_ID_NONE, -1, options_move_direction, &custom_element.move_direction_initial, "starts moving", NULL, "initial element move direction" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), - GADGET_ID_CUSTOM_MOVE_STEPSIZE, + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), + GADGET_ID_CUSTOM_MOVE_STEPSIZE, GADGET_ID_NONE, -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), - GADGET_ID_CUSTOM_SMASH_TARGETS, + ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(9), + GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH, -1, options_smash_targets, - &value_smash_targets, + &custom_element.smash_targets, "can smash", NULL, "elements that can be smashed" }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10), + GADGET_ID_CUSTOM_SLIPPERY_TYPE, GADGET_ID_NONE, + -1, + options_slippery_type, + &custom_element.slippery_type, + "slippery", NULL, "where other elements fall down" + }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), + GADGET_ID_CUSTOM_DEADLINESS, GADGET_ID_NONE, + -1, + options_deadliness, + &custom_element.deadliness, + "deadly when", NULL, "deadliness of element" + }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12), - GADGET_ID_CUSTOM_WALKABLE_LAYER, + GADGET_ID_CUSTOM_CONSISTENCY, GADGET_ID_NONE, -1, - options_walkable_layer, - &value_walkable_layer, - "player can walk", NULL, "layer where player can walk" + options_consistency, + &custom_element.consistency, + NULL, "explodes to:", "consistency/destructibility" }, + + /* ---------- element settings: advanced (custom elements) --------------- */ + { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(4), - GADGET_ID_CHANGE_TIME_UNITS, + GADGET_ID_CHANGE_TIME_UNITS, GADGET_ID_NONE, -1, options_time_units, &custom_element.change.delay_frames, @@ -1025,27 +1171,35 @@ static struct }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(5), - GADGET_ID_CHANGE_PLAYER_ACTION, + GADGET_ID_CHANGE_PLAYER_ACTION, GADGET_ID_NONE, -1, options_change_player_action, - &value_change_player_action, + &custom_element.change_player_action, NULL, "by player", "type of player contact" }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(6), - GADGET_ID_CHANGE_IMPACT_ACTION, + GADGET_ID_CHANGE_COLLIDE_ACTION, GADGET_ID_NONE, -1, - options_change_impact_action, - &value_change_impact_action, + options_change_collide_action, + &custom_element.change_collide_action, NULL, NULL, "change after impact or smash" }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(7), - GADGET_ID_CHANGE_OTHER_ACTION, + GADGET_ID_CHANGE_OTHER_ACTION, GADGET_ID_NONE, -1, options_change_other_action, - &value_change_other_action, - NULL, "other element:", "type of other element action" + &custom_element.change_other_action, + NULL, "element:", "type of other element action" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(10), + GADGET_ID_CHANGE_POWER, GADGET_ID_NONE, + -1, + options_change_power, + &custom_element.change.power, + "power:", NULL, "power of extended change" }, }; @@ -1053,28 +1207,29 @@ static struct { int x, y; int gadget_id; + int gadget_id_align; int size; char *text, *infotext; } textbutton_info[ED_NUM_TEXTBUTTON] = { { ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(1), - GADGET_ID_PROPERTIES_INFO, + GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE, 11, "Information", "Show information about element" }, { ED_SETTINGS_XPOS(0) + 166, ED_COUNTER_YPOS(1), - GADGET_ID_PROPERTIES_CONFIG, + GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_NONE, 11, "Configure", "Configure element properties" }, { ED_SETTINGS_XPOS(0) + 332, ED_COUNTER_YPOS(1), - GADGET_ID_PROPERTIES_ADVANCED, + GADGET_ID_PROPERTIES_ADVANCED, GADGET_ID_NONE, 11, "Advanced", "Advanced element configuration" }, { - ED_SETTINGS_XPOS(0) + 262, ED_SETTINGS_YPOS(12), - GADGET_ID_SAVE_AS_TEMPLATE, + ED_SETTINGS_XPOS(0) + 262, ED_SETTINGS_YPOS(13), + GADGET_ID_SAVE_AS_TEMPLATE, GADGET_ID_CUSTOM_USE_TEMPLATE, -1, "Save as template", "Save current settings as new template" }, }; @@ -1165,25 +1320,26 @@ static struct { int x, y; int gadget_id; + int gadget_id_align; int radio_button_nr; int *value; int checked_value; - char *text_right, *infotext; + char *text_left, *text_right, *infotext; } radiobutton_info[ED_NUM_RADIOBUTTONS] = { { ED_SETTINGS_XPOS(0) + 160, ED_COUNTER2_YPOS(8), - GADGET_ID_RANDOM_PERCENTAGE, + GADGET_ID_RANDOM_PERCENTAGE, GADGET_ID_LEVEL_RANDOM_UP, RADIO_NR_RANDOM_ELEMENTS, &random_placement_method, RANDOM_USE_PERCENTAGE, - "percentage", "use percentage for random elements" + " ", "percentage", "use percentage for random elements" }, { ED_SETTINGS_XPOS(0) + 340, ED_COUNTER2_YPOS(8), - GADGET_ID_RANDOM_QUANTITY, + GADGET_ID_RANDOM_QUANTITY, GADGET_ID_RANDOM_PERCENTAGE, RADIO_NR_RANDOM_ELEMENTS, &random_placement_method, RANDOM_USE_QUANTITY, - "quantity", "use quantity for random elements" + " ", "quantity", "use quantity for random elements" } }; @@ -1191,147 +1347,319 @@ static struct { int x, y; int gadget_id; + int gadget_id_align; boolean *value; - char *text_right, *infotext; + char *text_left, *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, + GADGET_ID_DOUBLE_SPEED, GADGET_ID_NONE, &level.double_speed, - "double speed movement", "set movement speed of player" + NULL, "double speed movement", "set movement speed of player" }, { ED_SETTINGS_XPOS(0) + 340, ED_COUNTER_YPOS(6) - MINI_TILEY, - GADGET_ID_GRAVITY, - &level.gravity, - "gravity", "set level gravity" + GADGET_ID_GRAVITY, GADGET_ID_DOUBLE_SPEED, + &level.initial_gravity, + " ", "gravity", "set level gravity" }, { ED_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(9) - MINI_TILEY, - GADGET_ID_RANDOM_RESTRICTED, + GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_NONE, &random_placement_background_restricted, - "restrict random placement to", "set random placement restriction" + NULL, + "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, + GADGET_ID_STICK_ELEMENT, GADGET_ID_NONE, &stick_element_properties_window, + NULL, "stick this screen to edit content","stick this screen to edit content" }, { ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4), - GADGET_ID_EM_SLIPPERY_GEMS, + GADGET_ID_EM_SLIPPERY_GEMS, GADGET_ID_NONE, &level.em_slippery_gems, + NULL, "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(0), ED_SETTINGS_YPOS(1), + GADGET_ID_CUSTOM_ACCESSIBLE, GADGET_ID_NONE, + &custom_element_properties[EP_ACCESSIBLE], + NULL, NULL, "player can walk to or pass this field" }, { - 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(0), ED_SETTINGS_YPOS(2), + GADGET_ID_CUSTOM_WALK_TO_OBJECT, GADGET_ID_NONE, + &custom_element_properties[EP_WALK_TO_OBJECT], + NULL, NULL, "player can dig/collect/push element" }, { - 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(0), ED_SETTINGS_YPOS(5), + GADGET_ID_CUSTOM_CAN_MOVE, GADGET_ID_NONE, + &custom_element_properties[EP_CAN_MOVE], + NULL, NULL, "element can move in some direction" }, { - 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(9), + GADGET_ID_CUSTOM_CAN_FALL, GADGET_ID_NONE, + &custom_element_properties[EP_CAN_FALL], + NULL, "can fall", "element can fall down" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(4), - GADGET_ID_CUSTOM_WALK_TO_OBJECT, - &custom_element_properties[EP_WALK_TO_OBJECT], - NULL, "player can dig/collect/push element" + ED_SETTINGS_XPOS(6), ED_SETTINGS_YPOS(9), + GADGET_ID_CUSTOM_CAN_SMASH, GADGET_ID_CUSTOM_CAN_FALL, + &custom_element_properties[EP_CAN_SMASH], + " ", NULL, "element can smash other elements" }, { - 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(10), + GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE, + &custom_element_properties[EP_SLIPPERY], + NULL, NULL, "other elements can fall down from it" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(6), - 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(11), + GADGET_ID_CUSTOM_DEADLY, GADGET_ID_NONE, + &custom_element_properties[EP_DEADLY], + NULL, NULL, "element can kill the player" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10), - GADGET_ID_CUSTOM_CAN_FALL, - &custom_element_properties[EP_CAN_FALL], - "can fall", "element can fall down" + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(12), + GADGET_ID_CUSTOM_EXPLODE_RESULT, GADGET_ID_NONE, + &custom_element_properties[EP_EXPLODE_RESULT], + NULL, NULL, "set consistency/destructibility" }, { - ED_SETTINGS_XPOS(6), ED_SETTINGS_YPOS(10), - GADGET_ID_CUSTOM_CAN_SMASH, - &custom_element_properties[EP_CAN_SMASH], - NULL, "element can smash other elements" + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE, + &custom_element.can_explode_by_fire, + NULL, "by fire", "element can explode by fire/explosion" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11), - GADGET_ID_CUSTOM_SLIPPERY, - &custom_element_properties[EP_SLIPPERY], - "slippery", "other elements can fall down from it" + ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE, + &custom_element.can_explode_smashed, + " ", "smashed", "element can explode when smashed" }, { - 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" + ED_SETTINGS_XPOS(13), ED_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH, + &custom_element.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, + GADGET_ID_CUSTOM_USE_GRAPHIC, GADGET_ID_NONE, &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" + NULL, "use graphic of element:", "use graphic for custom element" }, { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2), - GADGET_ID_CUSTOM_CAN_CHANGE, + GADGET_ID_CUSTOM_CAN_CHANGE, GADGET_ID_NONE, &custom_element_properties[EP_CAN_CHANGE], - "element changes to after/when:","element can change to other element" + NULL, "element changes to:", "element can change to other element" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3), - GADGET_ID_CHANGE_DELAY, + GADGET_ID_CHANGE_DELAY, GADGET_ID_NONE, &custom_element_change_events[CE_DELAY], - NULL, "element changes after delay" + NULL, NULL, "element changes after delay" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5), - GADGET_ID_CHANGE_BY_PLAYER, + GADGET_ID_CHANGE_BY_PLAYER, GADGET_ID_NONE, &custom_element_change_events[CE_BY_PLAYER], - NULL, "element changes by player contact" + NULL, NULL, "element changes by player contact" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), - GADGET_ID_CHANGE_IMPACT_SMASHED, - &custom_element_change_events[CE_IMPACT_SMASHED], - NULL, "element changes by impact or smash" + GADGET_ID_CHANGE_BY_COLLISION, GADGET_ID_NONE, + &custom_element_change_events[CE_BY_COLLISION], + NULL, NULL, "element changes by impact or smash" }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), - GADGET_ID_CHANGE_BY_OTHER, + GADGET_ID_CHANGE_BY_OTHER, GADGET_ID_NONE, &custom_element_change_events[CE_BY_OTHER], - NULL, "element changes by other element" + NULL, NULL, "element changes by other element" + }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), + GADGET_ID_CHANGE_USE_EXPLOSION, GADGET_ID_NONE, + &custom_element.change.explode, + NULL, "explode instead of change", "element explodes instead of change" + }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), + GADGET_ID_CHANGE_USE_CONTENT, GADGET_ID_NONE, + &custom_element.change.use_content, + NULL, "use extended change target:","element changes to more elements" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(11), + GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE, + &custom_element.change.only_complete, + NULL, "only use complete change", "only use complete extended content" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(12), + GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE, + &custom_element.change.use_random_change, + NULL, NULL, "use random value for new content" + }, + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_USE_TEMPLATE, GADGET_ID_NONE, + &level.use_custom_template, + NULL, "use template", "use template for custom properties" + }, +}; + +static struct +{ + int x, y; + int area_xsize, area_ysize; + int gadget_id; + int gadget_id_align; + char *text_left, *text_right; +} drawingarea_info[ED_NUM_DRAWING_AREAS] = +{ + /* ---------- level playfield content ------------------------------------ */ + + { + 0, 0, + MAX_ED_FIELDX, MAX_ED_FIELDY, + GADGET_ID_DRAWING_LEVEL, GADGET_ID_NONE, + NULL, NULL + }, + + /* ---------- yam yam content -------------------------------------------- */ + + { + ED_AREA_YAMYAM_CONTENT_XPOS(0), ED_AREA_YAMYAM_CONTENT_YPOS(0), + 3, 3, + GADGET_ID_ELEMENT_CONTENT_0, GADGET_ID_NONE, + NULL, NULL + }, + { + ED_AREA_YAMYAM_CONTENT_XPOS(1), ED_AREA_YAMYAM_CONTENT_YPOS(1), + 3, 3, + GADGET_ID_ELEMENT_CONTENT_1, GADGET_ID_NONE, + NULL, NULL + }, + { + ED_AREA_YAMYAM_CONTENT_XPOS(2), ED_AREA_YAMYAM_CONTENT_YPOS(2), + 3, 3, + GADGET_ID_ELEMENT_CONTENT_2, GADGET_ID_NONE, + NULL, NULL + }, + { + ED_AREA_YAMYAM_CONTENT_XPOS(3), ED_AREA_YAMYAM_CONTENT_YPOS(3), + 3, 3, + GADGET_ID_ELEMENT_CONTENT_3, GADGET_ID_NONE, + NULL, NULL + }, + { + ED_AREA_YAMYAM_CONTENT_XPOS(4), ED_AREA_YAMYAM_CONTENT_YPOS(4), + 3, 3, + GADGET_ID_ELEMENT_CONTENT_4, GADGET_ID_NONE, + NULL, NULL + }, + { + ED_AREA_YAMYAM_CONTENT_XPOS(5), ED_AREA_YAMYAM_CONTENT_YPOS(5), + 3, 3, + GADGET_ID_ELEMENT_CONTENT_5, GADGET_ID_NONE, + NULL, NULL + }, + { + ED_AREA_YAMYAM_CONTENT_XPOS(6), ED_AREA_YAMYAM_CONTENT_YPOS(6), + 3, 3, + GADGET_ID_ELEMENT_CONTENT_6, GADGET_ID_NONE, + NULL, NULL + }, + { + ED_AREA_YAMYAM_CONTENT_XPOS(7), ED_AREA_YAMYAM_CONTENT_YPOS(7), + 3, 3, + GADGET_ID_ELEMENT_CONTENT_7, GADGET_ID_NONE, + NULL, NULL + }, + + /* ---------- amoeba content --------------------------------------------- */ + + { + ED_AREA_ELEM_CONTENT_XPOS, ED_AREA_ELEM_CONTENT_YPOS, + 1, 1, + GADGET_ID_AMOEBA_CONTENT, GADGET_ID_NONE, + NULL, NULL + }, + + /* ---------- custom graphic --------------------------------------------- */ + + { + ED_AREA_ELEM_CONTENT3_XPOS, ED_AREA_ELEM_CONTENT3_YPOS, + 1, 1, + GADGET_ID_CUSTOM_GRAPHIC, GADGET_ID_CUSTOM_USE_GRAPHIC, + NULL, NULL + }, + + /* ---------- custom content (when exploding) ---------------------------- */ + + { + ED_AREA_ELEM_CONTENT4_XPOS, ED_AREA_ELEM_CONTENT4_YPOS, + 3, 3, + GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, /* align three rows */ + NULL, NULL + }, + + /* ---------- custom change target --------------------------------------- */ + + { + ED_AREA_ELEM_CONTENT2_XPOS, ED_AREA_ELEM_CONTENT2_YPOS, + 1, 1, + GADGET_ID_CUSTOM_CHANGE_TARGET, GADGET_ID_CUSTOM_CAN_CHANGE, + NULL, "after/when:" + }, + + /* ---------- custom change content (extended change target) ------------- */ + + { + ED_AREA_ELEM_CONTENT6_XPOS, ED_AREA_ELEM_CONTENT6_YPOS, + 3, 3, + GADGET_ID_CUSTOM_CHANGE_CONTENT, GADGET_ID_NONE, /* align three rows */ + NULL, NULL + }, + + /* ---------- custom change trigger (element causing change) ------------- */ + + { + ED_AREA_ELEM_CONTENT5_XPOS, ED_AREA_ELEM_CONTENT5_YPOS, + 1, 1, + GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION, + NULL, NULL + }, + + /* ---------- random background (for random painting) -------------------- */ + + { + ED_AREA_RANDOM_BACKGROUND_XPOS, ED_AREA_RANDOM_BACKGROUND_YPOS, + 1, 1, + GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED, + NULL, NULL }, }; @@ -1365,6 +1693,7 @@ static void ModifyEditorCounter(int, int); static void ModifyEditorCounterLimits(int, int, int); static void ModifyEditorSelectbox(int, int); static void ModifyEditorElementList(); +static void RedrawDrawingElements(); static void DrawDrawingWindow(); static void DrawLevelInfoWindow(); static void DrawPropertiesWindow(); @@ -1381,6 +1710,7 @@ static void HandleControlButtons(struct GadgetInfo *); static void HandleDrawingAreaInfo(struct GadgetInfo *); static struct GadgetInfo *level_editor_gadget[NUM_EDITOR_GADGETS]; +static int right_gadget_border[NUM_EDITOR_GADGETS]; static int drawing_function = GADGET_ID_SINGLE_ITEMS; static int last_drawing_function = GADGET_ID_SINGLE_ITEMS; @@ -1470,7 +1800,7 @@ static int editor_el_emerald_mine[] = EL_STEELWALL, EL_WALL, - EL_WALL_CRUMBLED, + EL_WALL_SLIPPERY, EL_MAGIC_WALL, EL_EMERALD, @@ -1791,7 +2121,7 @@ static int editor_el_diamond_caves[] = EL_LANDMINE, EL_INVISIBLE_SAND, - EL_STEELWALL_SLANTED, + EL_STEELWALL_SLIPPERY, EL_EMPTY, EL_SIGN_EXCLAMATION, @@ -2233,14 +2563,22 @@ static void ReinitializeElementListButtons() initialization_needed = FALSE; } -static int getCounterGadgetWidth() +static int getMaxInfoTextLength() { - return (DXSIZE + getFontWidth(FONT_INPUT_1) - 2 * ED_GADGET_DISTANCE); + return (SXSIZE / getFontWidth(FONT_TEXT_2)); } -static int getMaxInfoTextLength() +static int getFullTextWidth(char *text) { - return (SXSIZE / getFontWidth(FONT_TEXT_2)); + if (text == NULL) + return 0; + + return (strlen(text) * getFontWidth(FONT_TEXT_1) + ED_GADGET_TEXT_DISTANCE); +} + +static int getRightGadgetBorder(struct GadgetInfo *gi, char *text) +{ + return (gi->x + gi->width + getFullTextWidth(text)); } static char *getElementInfoText(int element) @@ -2249,7 +2587,9 @@ static char *getElementInfoText(int element) if (element < NUM_FILE_ELEMENTS) { - if (element_info[element].custom_description != NULL) + if (strlen(element_info[element].description) > 0) + info_text = element_info[element].description; + else if (element_info[element].custom_description != NULL) info_text = element_info[element].custom_description; else if (element_info[element].editor_description != NULL) info_text = element_info[element].editor_description; @@ -2514,15 +2854,18 @@ static void CreateCounterButtons() for (i=0; iwidth + ED_GADGET_DISTANCE; /* xpos of text count button */ + right_gadget_border[id] = + getRightGadgetBorder(gi, counterbutton_info[i].text_right); + + x += gi->width + ED_GADGET_DISTANCE; /* text count button */ if (j == 0) { @@ -2606,8 +2952,8 @@ static void CreateCounterButtons() font_type = FONT_LEVEL_NUMBER; font_type_active = FONT_LEVEL_NUMBER; - xpos += 2 * ED_GADGET_DISTANCE; - ypos -= ED_GADGET_DISTANCE; + x += 2 * ED_GADGET_DISTANCE; + y -= ED_GADGET_DISTANCE; gd_x = DOOR_GFX_PAGEX6 + ED_WIN_COUNT2_XPOS; gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT2_YPOS; @@ -2622,8 +2968,8 @@ static void CreateCounterButtons() gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, GDI_INFO_TEXT, "enter counter value", - GDI_X, xpos + xoffset, - GDI_Y, ypos, + GDI_X, x, + GDI_Y, y, GDI_TYPE, GD_TYPE_TEXTINPUT_NUMERIC, GDI_NUMBER_VALUE, 0, GDI_NUMBER_MIN, counterbutton_info[i].min_value, @@ -2644,7 +2990,10 @@ static void CreateCounterButtons() Error(ERR_EXIT, "cannot create gadget"); level_editor_gadget[id] = gi; - xpos += gi->width + ED_GADGET_DISTANCE; /* xpos of up count button */ + right_gadget_border[id] = + getRightGadgetBorder(gi, counterbutton_info[i].text_right); + + x += gi->width + ED_GADGET_DISTANCE; /* up count button */ } } } @@ -2652,47 +3001,38 @@ static void CreateCounterButtons() static void CreateDrawingAreas() { - struct GadgetInfo *gi; - unsigned long event_mask; - int id; int i; - event_mask = - GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING | - GD_EVENT_OFF_BORDERS; - - /* one for the level drawing area ... */ - id = GADGET_ID_DRAWING_LEVEL; - gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_X, SX, - GDI_Y, SY, - GDI_TYPE, GD_TYPE_DRAWING_AREA, - GDI_AREA_SIZE, ed_fieldx, ed_fieldy, - 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; - - /* ... up to eight areas for element content ... */ - for (i=0; ix - xoffset_left; + int x_right = gi_up->x + gi_up->width + xoffset_right; + int y_above = gi_down->y - yoffset_above; + int x = gi_down->x; + int y = gi_up->y + yoffset; +#endif if (counterbutton_info[id].text_above) - { - x = SX + counterbutton_info[id].x + xoffset_above; - y = SY + counterbutton_info[id].y + yoffset_above; - - sprintf(infotext, "%s:", counterbutton_info[id].text_above); - infotext[max_infotext_len] = '\0'; - DrawText(x, y, infotext, FONT_TEXT_1); - } + DrawText(x, y_above, counterbutton_info[id].text_above, FONT_TEXT_1); if (counterbutton_info[id].text_left) - { - x = SX + counterbutton_info[id].x + xoffset_left; - y = SY + counterbutton_info[id].y + yoffset_left; - - sprintf(infotext, "%s", counterbutton_info[id].text_left); - infotext[max_infotext_len] = '\0'; - DrawText(x, y, infotext, FONT_TEXT_1); - } + DrawText(x_left, y, counterbutton_info[id].text_left, FONT_TEXT_1); if (counterbutton_info[id].text_right) - { - int gadget_id = counterbutton_info[id].gadget_id_down; - - x = level_editor_gadget[gadget_id]->x + xoffset_right; - y = SY + counterbutton_info[id].y + yoffset_right; - - sprintf(infotext, "%s", counterbutton_info[id].text_right); - infotext[max_infotext_len] = '\0'; - DrawText(x, y, infotext, FONT_TEXT_1); - } + DrawText(x_right, y, counterbutton_info[id].text_right, FONT_TEXT_1); ModifyEditorCounter(id, *counterbutton_info[id].value); @@ -3264,7 +3542,7 @@ static void MapControlButtons() static void MapDrawingArea(int id) { - MapGadget(level_editor_gadget[id]); + MapGadget(level_editor_gadget[drawingarea_info[id].gadget_id]); } static void MapTextInputGadget(int id) @@ -3276,9 +3554,12 @@ static void MapTextInputGadget(int id) int x = textinput_info[id].x + xoffset_above; int y = textinput_info[id].y + yoffset_above; - sprintf(infotext, "%s:", textinput_info[id].infotext); - infotext[max_infotext_len] = '\0'; - DrawTextF(x, y, FONT_TEXT_1, infotext); + if (textinput_info[id].infotext) + { + sprintf(infotext, "%s:", textinput_info[id].infotext); + infotext[max_infotext_len] = '\0'; + DrawTextF(x, y, FONT_TEXT_1, infotext); + } ModifyGadget(level_editor_gadget[textinput_info[id].gadget_id], GDI_TEXT_VALUE, textinput_info[id].value, GDI_END); @@ -3288,24 +3569,28 @@ static void MapTextInputGadget(int id) static void MapSelectboxGadget(int id) { + struct GadgetInfo *gi = level_editor_gadget[selectbox_info[id].gadget_id]; +#if 0 int xoffset_left = 0; int yoffset_left = ED_BORDER_SIZE; int xoffset_right = ED_GADGET_TEXT_DISTANCE; int yoffset_right = ED_BORDER_SIZE; int x = selectbox_info[id].x + xoffset_left; int y = selectbox_info[id].y + yoffset_left; +#else + int xoffset_left = getFullTextWidth(selectbox_info[id].text_left); + int xoffset_right = ED_GADGET_TEXT_DISTANCE; + int yoffset = ED_BORDER_SIZE; + int x_left = gi->x - xoffset_left; + int x_right = gi->x + gi->width + xoffset_right; + int y = gi->y + yoffset; +#endif - DrawTextF(x, y, FONT_TEXT_1, selectbox_info[id].text_left); + if (selectbox_info[id].text_left) + DrawText(x_left, y, selectbox_info[id].text_left, FONT_TEXT_1); if (selectbox_info[id].text_right) - { - struct GadgetInfo *gi = level_editor_gadget[selectbox_info[id].gadget_id]; - - x = gi->x + gi->width + xoffset_right; - y = SY + selectbox_info[id].y + yoffset_right; - - DrawText(x, y, selectbox_info[id].text_right, FONT_TEXT_1); - } + DrawText(x_right, y, selectbox_info[id].text_right, FONT_TEXT_1); ModifyEditorSelectbox(id, *selectbox_info[id].value); @@ -3319,14 +3604,29 @@ static void MapTextbuttonGadget(int id) static void MapRadiobuttonGadget(int id) { + struct GadgetInfo *gi = level_editor_gadget[radiobutton_info[id].gadget_id]; +#if 0 int xoffset_right = ED_XOFFSET_CHECKBOX; int yoffset_right = ED_BORDER_SIZE; int x = radiobutton_info[id].x + xoffset_right; int y = radiobutton_info[id].y + yoffset_right; +#else + int xoffset_left = getFullTextWidth(checkbutton_info[id].text_left); + int xoffset_right = ED_GADGET_TEXT_DISTANCE; + int yoffset = ED_BORDER_SIZE; + int x_left = gi->x - xoffset_left; + int x_right = gi->x + gi->width + xoffset_right; + int y = gi->y + yoffset; +#endif boolean checked = (*radiobutton_info[id].value == radiobutton_info[id].checked_value); - DrawTextF(x, y, FONT_TEXT_1, radiobutton_info[id].text_right); + if (radiobutton_info[id].text_left) + DrawText(x_left, y, radiobutton_info[id].text_left, FONT_TEXT_1); + + if (radiobutton_info[id].text_right) + DrawText(x_right, y, radiobutton_info[id].text_right, FONT_TEXT_1); + ModifyGadget(level_editor_gadget[radiobutton_info[id].gadget_id], GDI_CHECKED, checked, GDI_END); @@ -3335,15 +3635,32 @@ static void MapRadiobuttonGadget(int id) static void MapCheckbuttonGadget(int id) { + struct GadgetInfo *gi = level_editor_gadget[checkbutton_info[id].gadget_id]; +#if 0 int xoffset_right = ED_XOFFSET_CHECKBOX; int yoffset_right = ED_BORDER_SIZE; int x = checkbutton_info[id].x + xoffset_right; int y = checkbutton_info[id].y + yoffset_right; +#else + int xoffset_left = getFullTextWidth(checkbutton_info[id].text_left); + int xoffset_right = ED_GADGET_TEXT_DISTANCE; + int yoffset = ED_BORDER_SIZE; + int x_left = gi->x - xoffset_left; + int x_right = gi->x + gi->width + xoffset_right; + int y = gi->y + yoffset; +#endif - DrawTextF(x, y, FONT_TEXT_1, checkbutton_info[id].text_right); + /* special case needed for "sticky" gadget */ ModifyGadget(level_editor_gadget[checkbutton_info[id].gadget_id], GDI_CHECKED, *checkbutton_info[id].value, GDI_Y, SY + checkbutton_info[id].y, GDI_END); + y = gi->y + yoffset; + + if (checkbutton_info[id].text_left) + DrawText(x_left, y, checkbutton_info[id].text_left, FONT_TEXT_1); + + if (checkbutton_info[id].text_right) + DrawText(x_right, y, checkbutton_info[id].text_right, FONT_TEXT_1); MapGadget(level_editor_gadget[checkbutton_info[id].gadget_id]); } @@ -3376,7 +3693,7 @@ static void MapMainDrawingArea() MapGadget(level_editor_gadget[scrollbar_info[i].gadget_id]); } - MapDrawingArea(GADGET_ID_DRAWING_LEVEL); + MapDrawingArea(ED_DRAWING_ID_DRAWING_LEVEL); } static void UnmapDrawingArea(int id) @@ -3410,6 +3727,9 @@ static void ResetUndoBuffer() static void DrawEditModeWindow() { + ModifyEditorElementList(); + RedrawDrawingElements(); + if (edit_mode == ED_MODE_INFO) DrawLevelInfoWindow(); else if (edit_mode == ED_MODE_PROPERTIES) @@ -3425,7 +3745,7 @@ static boolean LevelChanged() for(y=0; yx, gi->y, MINI_TILEX, MINI_TILEY, TRUE); + DrawMiniElement(gi->x, gi->y, random_placement_background_element); - MapDrawingArea(GADGET_ID_RANDOM_BACKGROUND); + MapDrawingArea(ED_DRAWING_ID_RANDOM_BACKGROUND); } static void DrawLevelInfoWindow() @@ -3969,16 +4357,18 @@ static void DrawAmoebaContentArea() DrawText(area_sx + TILEX, area_sy + 1, "Content of amoeba", FONT_TEXT_1); - MapDrawingArea(GADGET_ID_AMOEBA_CONTENT); + MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT); } static void DrawCustomGraphicElementArea() { struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_GRAPHIC]; +#if 0 int xpos = ED_AREA_ELEM_CONTENT3_XPOS; int ypos = ED_AREA_ELEM_CONTENT3_YPOS; int area_sx = SX + xpos; int area_sy = SY + ypos; +#endif if (!IS_CUSTOM_ELEMENT(properties_element)) { @@ -3988,18 +4378,24 @@ static void DrawCustomGraphicElementArea() return; } - DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); + DrawElementBorder(gi->x, gi->y, MINI_TILEX, MINI_TILEY, TRUE); DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(custom_element.gfx_element)); - MapDrawingArea(GADGET_ID_CUSTOM_GRAPHIC); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_GRAPHIC); } static void DrawCustomContentArea() { struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CONTENT]; +#if 0 int area_sx = SX + ED_AREA_ELEM_CONTENT4_XPOS; int area_sy = SY + ED_AREA_ELEM_CONTENT4_YPOS; +#endif + int x1 = right_gadget_border[GADGET_ID_CUSTOM_DEADLINESS]; + int x2 = right_gadget_border[GADGET_ID_CUSTOM_CONSISTENCY]; + int x3 = right_gadget_border[GADGET_ID_CUSTOM_EXPLODE_IMPACT]; + int xoffset = ED_GADGET_TEXT_DISTANCE + MINI_TILEX / 2; int x, y; if (!IS_CUSTOM_ELEMENT(properties_element)) @@ -4010,23 +4406,35 @@ static void DrawCustomContentArea() return; } - DrawElementBorder(area_sx, area_sy, 3 * MINI_TILEX, 3 * MINI_TILEY, TRUE); + ModifyGadget(gi, GDI_X, MAX(x1, MAX(x2, x3)) + xoffset, GDI_END); + + DrawElementBorder(gi->x, gi->y, 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.content[x][y])); - MapDrawingArea(GADGET_ID_CUSTOM_CONTENT); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_CONTENT); } static void DrawCustomChangeTargetArea() { - struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGE_TARGET]; + int id = ED_DRAWING_ID_CUSTOM_CHANGE_TARGET; + int gadget_id = drawingarea_info[id].gadget_id; + struct GadgetInfo *gi = level_editor_gadget[gadget_id]; +#if 0 int xpos = ED_AREA_ELEM_CONTENT2_XPOS; int ypos = ED_AREA_ELEM_CONTENT2_YPOS; int area_sx = SX + xpos; int area_sy = SY + ypos; +#endif + int xoffset_left = 0; + int yoffset_left = ED_BORDER_AREA_YSIZE; + int xoffset_right = ED_GADGET_TEXT_DISTANCE + MINI_TILEX / 2; + int yoffset_right = ED_BORDER_AREA_YSIZE; + int x = drawingarea_info[id].x + xoffset_left; + int y = drawingarea_info[id].y + yoffset_left; if (!IS_CUSTOM_ELEMENT(properties_element)) { @@ -4036,20 +4444,66 @@ static void DrawCustomChangeTargetArea() return; } - DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); + DrawElementBorder(gi->x, gi->y, MINI_TILEX, MINI_TILEY, TRUE); DrawMiniGraphicExt(drawto, gi->x, gi->y, - el2edimg(custom_element.change.successor)); + el2edimg(custom_element.change.target_element)); + + MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET); + + if (drawingarea_info[id].text_left) + DrawTextF(x, y, FONT_TEXT_1, drawingarea_info[id].text_left); + + if (drawingarea_info[id].text_right) + { + x = gi->x + gi->width + xoffset_right; + y = SY + drawingarea_info[id].y + yoffset_right; + + DrawText(x, y, drawingarea_info[id].text_right, FONT_TEXT_1); + } +} + +static void DrawCustomChangeContentArea() +{ + struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGE_CONTENT]; +#if 0 + int area_sx = SX + ED_AREA_ELEM_CONTENT6_XPOS; + int area_sy = SY + ED_AREA_ELEM_CONTENT6_YPOS; +#endif + int x1 = right_gadget_border[GADGET_ID_CHANGE_USE_CONTENT]; + int x2 = right_gadget_border[GADGET_ID_CHANGE_POWER]; + int x3 = right_gadget_border[GADGET_ID_CHANGE_ONLY_COMPLETE]; + int xoffset = ED_GADGET_TEXT_DISTANCE + MINI_TILEX / 2; + 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; + } + + ModifyGadget(gi, GDI_X, MAX(x1, MAX(x2, x3)) + xoffset, GDI_END); - MapDrawingArea(GADGET_ID_CUSTOM_CHANGE_TARGET); + DrawElementBorder(gi->x, gi->y, 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(ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT); } static void DrawCustomChangeTriggerArea() { struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGE_TRIGGER]; +#if 0 int xpos = ED_AREA_ELEM_CONTENT5_XPOS; int ypos = ED_AREA_ELEM_CONTENT5_YPOS; int area_sx = SX + xpos; int area_sy = SY + ypos; +#endif if (!IS_CUSTOM_ELEMENT(properties_element)) { @@ -4059,11 +4513,11 @@ static void DrawCustomChangeTriggerArea() return; } - DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); + DrawElementBorder(gi->x, gi->y, 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); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER); } static void DrawElementContentAreas() @@ -4108,7 +4562,7 @@ static void DrawElementContentAreas() } for (i=0; iy + gd_gi->height - 1; Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y); int id_first = ED_TEXTBUTTON_ID_PROPERTIES_INFO; -#if 1 int id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG; -#else - int id_last = ED_TEXTBUTTON_ID_PROPERTIES_INFO; -#endif int i; -#if 0 - /* draw additional "configure" tabulator for configurable elements */ - if (checkPropertiesConfig()) - id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG; -#endif - /* draw additional "advanced" tabulator for custom elements */ if (IS_CUSTOM_ELEMENT(properties_element)) id_last = ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED; @@ -4347,9 +4791,13 @@ static void DrawPropertiesInfo() properties[] = { /* configurable properties */ - { EP_INDESTRUCTIBLE, "- undestructible" }, - { EP_SLIPPERY, "- slippery for falling objects" }, - { EP_EM_SLIPPERY_WALL, "- slippery for some gems (EM style)" }, + + { EP_WALKABLE_OVER, "- player can walk over it" }, + { EP_WALKABLE_INSIDE, "- player can walk inside it" }, + { EP_WALKABLE_UNDER, "- player can walk under it" }, + { EP_PASSABLE_OVER, "- player can pass over it" }, + { EP_PASSABLE_INSIDE, "- player can pass through it" }, + { EP_PASSABLE_UNDER, "- player can pass under it" }, { EP_DIGGABLE, "- diggable" }, { EP_COLLECTIBLE, "- collectible" }, @@ -4357,27 +4805,27 @@ static void DrawPropertiesInfo() { EP_CAN_MOVE, "- can move" }, { EP_CAN_FALL, "- can fall" }, -#if 0 - { EP_CAN_SMASH, "- can smash" }, -#endif + { EP_CAN_SMASH_PLAYER, "- can smash player" }, +#if 0 { EP_CAN_SMASH_ENEMIES, "- can smash good and bad guys" }, +#endif { EP_CAN_SMASH_EVERYTHING, "- can smash everything smashable" }, - { EP_CAN_EXPLODE, "- can explode" }, - { EP_CAN_EXPLODE_BY_FIRE, " - by fire or explosions" }, - { EP_CAN_EXPLODE_SMASHED, " - when smashed" }, - { EP_CAN_EXPLODE_IMPACT, " - on impact" }, + + { EP_SLIPPERY, "- slippery for falling objects" }, + { EP_EM_SLIPPERY_WALL, "- slippery for some gems (EM style)" }, { EP_DONT_RUN_INTO, "- deadly when running into" }, { EP_DONT_COLLIDE_WITH, "- deadly when colliding with" }, { EP_DONT_TOUCH, "- deadly when touching" }, - { EP_WALKABLE_OVER, "- player can walk over it" }, - { EP_WALKABLE_INSIDE, "- player can walk inside it" }, - { EP_WALKABLE_UNDER, "- player can walk under it" }, - { EP_PASSABLE_OVER, "- player can pass over it" }, - { EP_PASSABLE_INSIDE, "- player can pass through it" }, - { EP_PASSABLE_UNDER, "- player can pass under it" }, + { EP_INDESTRUCTIBLE, "- undestructible" }, + + { EP_CAN_EXPLODE_BY_FIRE, "- can explode by fire or explosions" }, + { EP_CAN_EXPLODE_SMASHED, "- can explode when smashed" }, + { EP_CAN_EXPLODE_IMPACT, "- can explode on impact" }, + + { EP_CAN_CHANGE, "- can change to other element" }, /* pre-defined properties */ { EP_CAN_PASS_MAGIC_WALL, "- can pass magic walls" }, @@ -4597,9 +5045,22 @@ static void DrawPropertiesConfig() /* draw drawing area gadgets */ DrawCustomContentArea(); + + /* draw text input gadgets */ + MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME); } } +static void DrawPropertiesAdvancedDrawingAreas() +{ + DrawCustomGraphicElementArea(); + DrawCustomChangeTargetArea(); + DrawCustomChangeTriggerArea(); + DrawCustomChangeContentArea(); + + redraw_mask |= REDRAW_FIELD; +} + static void DrawPropertiesAdvanced() { int i; @@ -4626,9 +5087,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) @@ -4688,12 +5147,6 @@ static void DrawPropertiesWindow() !IS_CUSTOM_ELEMENT(properties_element)) edit_mode_properties = ED_MODE_PROPERTIES_CONFIG; -#if 0 - if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG && - !checkPropertiesConfig()) - edit_mode_properties = ED_MODE_PROPERTIES_INFO; -#endif - if (IS_CUSTOM_ELEMENT(properties_element)) CopyCustomElementPropertiesToEditor(properties_element); @@ -4728,6 +5181,16 @@ static void DrawPropertiesWindow() DrawPropertiesAdvanced(); } +static void UpdateCustomElementGraphicGadgets() +{ + ModifyEditorElementList(); + RedrawDrawingElements(); + + if (edit_mode == ED_MODE_PROPERTIES && + edit_mode_properties == ED_MODE_PROPERTIES_ADVANCED) + DrawPropertiesAdvancedDrawingAreas(); +} + static void DrawLineElement(int sx, int sy, int element, boolean change_level) { int lx = sx + level_xpos; @@ -5392,6 +5855,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: @@ -5458,27 +5925,36 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) { new_element = GFX_ELEMENT(new_element); custom_element.gfx_element = new_element; - element_info[properties_element] = custom_element; - ModifyEditorElementList(); - RedrawDrawingElements(); + CopyCustomElementPropertiesToGame(properties_element); + + UpdateCustomElementGraphicGadgets(); FrameCounter = 0; /* restart animation frame counter */ } else if (id == GADGET_ID_CUSTOM_CONTENT) { custom_element.content[sx][sy] = new_element; - element_info[properties_element] = custom_element; + + CopyCustomElementPropertiesToGame(properties_element); } else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) { - custom_element.change.successor = new_element; - element_info[properties_element] = custom_element; + custom_element.change.target_element = new_element; + + CopyCustomElementPropertiesToGame(properties_element); + } + else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) + { + custom_element.change.content[sx][sy] = new_element; + + CopyCustomElementPropertiesToGame(properties_element); } else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) { - custom_element.change.trigger = new_element; - element_info[properties_element] = custom_element; + custom_element.change.trigger_element = new_element; + + CopyCustomElementPropertiesToGame(properties_element); } else if (id == GADGET_ID_RANDOM_BACKGROUND) random_placement_background_element = new_element; @@ -5591,9 +6067,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 && @@ -5675,7 +6153,16 @@ static void HandleCounterButtons(struct GadgetInfo *gi) static void HandleTextInputGadgets(struct GadgetInfo *gi) { - strcpy(textinput_info[gi->custom_type_id].value, gi->text.value); + int type_id = gi->custom_type_id; + + strcpy(textinput_info[type_id].value, gi->text.value); + + if (type_id == ED_TEXTINPUT_ID_ELEMENT_NAME) + { + CopyCustomElementPropertiesToGame(properties_element); + + ModifyEditorElementList(); /* update changed button info text */ + } } static void HandleSelectboxGadgets(struct GadgetInfo *gi) @@ -5694,13 +6181,26 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) static void HandleTextbuttonGadgets(struct GadgetInfo *gi) { - if (gi->custom_type_id >= ED_TEXTBUTTON_ID_PROPERTIES_INFO && - gi->custom_type_id <= ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED) + int type_id = gi->custom_type_id; + + if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_INFO && + type_id <= ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED) { edit_mode_properties = gi->custom_type_id; DrawPropertiesWindow(); } + else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE) + { + boolean new_template = (!LevelFileExists(-1)); + + if (new_template || + Request("Save this tem- plate and kill the old ?", REQ_ASK)) + SaveLevelTemplate(); + + if (new_template) + Request("Tem- plate saved !", REQ_CONFIRM); + } } static void HandleRadiobuttons(struct GadgetInfo *gi) @@ -5718,13 +6218,31 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) if ((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST && type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) || (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST && - type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST)) + type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST && + type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE)) + { CopyCustomElementPropertiesToGame(properties_element); + } if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC) { - ModifyEditorElementList(); - RedrawDrawingElements(); + UpdateCustomElementGraphicGadgets(); + } + else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) + { + if (level.use_custom_template && !LevelFileExists(-1)) + { + Request("No level tem- plate found !", REQ_CONFIRM); + + level.use_custom_template = FALSE; + ModifyGadget(gi, GDI_CHECKED, FALSE, GDI_END); + + return; + } + + LoadLevelTemplate(level.use_custom_template ? -1 : level_nr); + + DrawEditModeWindow(); } } @@ -5741,7 +6259,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; @@ -5971,12 +6490,18 @@ static void HandleControlButtons(struct GadgetInfo *gi) Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM); else { - if (Request("Save this level and kill the old ?", REQ_ASK)) + boolean new_level = (!LevelFileExists(level_nr)); + + if (new_level || + Request("Save this level and kill the old ?", REQ_ASK)) { - CopyPlayfield(Feld, Ur); + CopyPlayfield(Feld, level.field); SaveLevel(level_nr); } + + if (new_level) + Request("Level saved !", REQ_CONFIRM); } break; @@ -5988,8 +6513,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (LevelChanged()) level.game_version = GAME_VERSION_ACTUAL; - CopyPlayfield(Ur, FieldBackup); - CopyPlayfield(Feld, Ur); + CopyPlayfield(level.field, FieldBackup); + CopyPlayfield(Feld, level.field); UnmapLevelEditorGadgets(); UndrawSpecialEditorDoor(); @@ -6022,7 +6547,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 +6708,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 +6736,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 +6781,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 +6819,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 +6827,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 +6844,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 +6890,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");