X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=739713440de0b57b8f56637bb12469a7a9d25f48;hp=4c592cf8c2a674ba36efba07f5ea280a1593f9b1;hb=7fbc29937c69f42e609080ddd29595e01750ec4c;hpb=fe3196f07cb50ffb788c0073b82f94c26f93cfbf diff --git a/src/editor.c b/src/editor.c index 4c592cf8..73971344 100644 --- a/src/editor.c +++ b/src/editor.c @@ -111,7 +111,7 @@ /* values for the settings windows */ #define ED_LEVEL_SETTINGS_XSTART (3 * MINI_TILEX / 2) -#define ED_LEVEL_SETTINGS_YSTART (5 * MINI_TILEY) +#define ED_LEVEL_SETTINGS_YSTART (7 * MINI_TILEY) #define ED_ELEMENT_SETTINGS_XSTART (3 * MINI_TILEX / 2) #define ED_ELEMENT_SETTINGS_YSTART (10 * MINI_TILEY) @@ -121,6 +121,7 @@ #define ED_SETTINGS_XOFFSET ED_XOFFSET_CHECKBOX #define ED_SETTINGS_YOFFSET (3 * MINI_TILEY / 2) +#define ED_SETTINGS_TAB_XOFFSET 124 #define ED_LEVEL_SETTINGS_XPOS(n) (ED_LEVEL_SETTINGS_XSTART + \ (n) * ED_SETTINGS_XOFFSET) @@ -132,6 +133,16 @@ #define ED_ELEMENT_SETTINGS_YPOS(n) (ED_ELEMENT_SETTINGS_YSTART + \ (n) * ED_SETTINGS_YOFFSET) +#define ED_LEVEL_SETTINGS_TABS_XPOS(n) (ED_LEVEL_SETTINGS_XPOS(0) + \ + (n) * ED_SETTINGS_TAB_XOFFSET) +#define ED_LEVEL_SETTINGS_TABS_YPOS(n) (ED_LEVEL_SETTINGS_YSTART - \ + 3 * MINI_TILEY) + +#define ED_ELEMENT_SETTINGS_TABS_XPOS(n) (ED_ELEMENT_SETTINGS_XPOS(0) + \ + (n) * ED_SETTINGS_TAB_XOFFSET) +#define ED_ELEMENT_SETTINGS_TABS_YPOS(n) (ED_ELEMENT_SETTINGS_YSTART - \ + 2 * MINI_TILEY) + #define ED_SETTINGS1_YPOS MINI_TILEY #define ED_SETTINGS2_XPOS MINI_TILEX #define ED_SETTINGS2_YPOS (ED_SETTINGS1_YPOS + 12 * TILEY - 2) @@ -348,84 +359,90 @@ #define GADGET_ID_LEVEL_TIMESCORE_DOWN (GADGET_ID_COUNTER_FIRST + 18) #define GADGET_ID_LEVEL_TIMESCORE_TEXT (GADGET_ID_COUNTER_FIRST + 19) #define GADGET_ID_LEVEL_TIMESCORE_UP (GADGET_ID_COUNTER_FIRST + 20) -#define GADGET_ID_ELEMENT_VALUE1_DOWN (GADGET_ID_COUNTER_FIRST + 21) -#define GADGET_ID_ELEMENT_VALUE1_TEXT (GADGET_ID_COUNTER_FIRST + 22) -#define GADGET_ID_ELEMENT_VALUE1_UP (GADGET_ID_COUNTER_FIRST + 23) -#define GADGET_ID_ELEMENT_VALUE2_DOWN (GADGET_ID_COUNTER_FIRST + 24) -#define GADGET_ID_ELEMENT_VALUE2_TEXT (GADGET_ID_COUNTER_FIRST + 25) -#define GADGET_ID_ELEMENT_VALUE2_UP (GADGET_ID_COUNTER_FIRST + 26) -#define GADGET_ID_ELEMENT_VALUE3_DOWN (GADGET_ID_COUNTER_FIRST + 27) -#define GADGET_ID_ELEMENT_VALUE3_TEXT (GADGET_ID_COUNTER_FIRST + 28) -#define GADGET_ID_ELEMENT_VALUE3_UP (GADGET_ID_COUNTER_FIRST + 29) -#define GADGET_ID_ELEMENT_VALUE4_DOWN (GADGET_ID_COUNTER_FIRST + 30) -#define GADGET_ID_ELEMENT_VALUE4_TEXT (GADGET_ID_COUNTER_FIRST + 31) -#define GADGET_ID_ELEMENT_VALUE4_UP (GADGET_ID_COUNTER_FIRST + 32) -#define GADGET_ID_YAMYAM_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 33) -#define GADGET_ID_YAMYAM_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 34) -#define GADGET_ID_YAMYAM_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 35) -#define GADGET_ID_BALL_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 36) -#define GADGET_ID_BALL_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 37) -#define GADGET_ID_BALL_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 38) -#define GADGET_ID_ANDROID_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 39) -#define GADGET_ID_ANDROID_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 40) -#define GADGET_ID_ANDROID_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 41) -#define GADGET_ID_ENVELOPE_XSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 42) -#define GADGET_ID_ENVELOPE_XSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 43) -#define GADGET_ID_ENVELOPE_XSIZE_UP (GADGET_ID_COUNTER_FIRST + 44) -#define GADGET_ID_ENVELOPE_YSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 45) -#define GADGET_ID_ENVELOPE_YSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 46) -#define GADGET_ID_ENVELOPE_YSIZE_UP (GADGET_ID_COUNTER_FIRST + 47) -#define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 48) -#define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 49) -#define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 50) -#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 51) -#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 52) -#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 53) -#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 54) -#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 55) -#define GADGET_ID_CUSTOM_VALUE_FIX_UP (GADGET_ID_COUNTER_FIRST + 56) -#define GADGET_ID_CUSTOM_VALUE_RND_DOWN (GADGET_ID_COUNTER_FIRST + 57) -#define GADGET_ID_CUSTOM_VALUE_RND_TEXT (GADGET_ID_COUNTER_FIRST + 58) -#define GADGET_ID_CUSTOM_VALUE_RND_UP (GADGET_ID_COUNTER_FIRST + 59) -#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 60) -#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 61) -#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 62) -#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 63) -#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 64) -#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 65) -#define GADGET_ID_DROP_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 66) -#define GADGET_ID_DROP_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 67) -#define GADGET_ID_DROP_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 68) -#define GADGET_ID_DROP_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 69) -#define GADGET_ID_DROP_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 70) -#define GADGET_ID_DROP_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 71) -#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 72) -#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 73) -#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 74) -#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 75) -#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 76) -#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 77) -#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 78) -#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 79) -#define GADGET_ID_EXPLOSION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 80) -#define GADGET_ID_IGNITION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 81) -#define GADGET_ID_IGNITION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 82) -#define GADGET_ID_IGNITION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 83) -#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 84) -#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 85) -#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 86) -#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 87) -#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 88) -#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 89) -#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 90) -#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 91) -#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 92) -#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 93) -#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 94) -#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 95) +#define GADGET_ID_LEVEL_RANDOM_SEED_DOWN (GADGET_ID_COUNTER_FIRST + 21) +#define GADGET_ID_LEVEL_RANDOM_SEED_TEXT (GADGET_ID_COUNTER_FIRST + 22) +#define GADGET_ID_LEVEL_RANDOM_SEED_UP (GADGET_ID_COUNTER_FIRST + 23) +#define GADGET_ID_ELEMENT_VALUE1_DOWN (GADGET_ID_COUNTER_FIRST + 24) +#define GADGET_ID_ELEMENT_VALUE1_TEXT (GADGET_ID_COUNTER_FIRST + 25) +#define GADGET_ID_ELEMENT_VALUE1_UP (GADGET_ID_COUNTER_FIRST + 26) +#define GADGET_ID_ELEMENT_VALUE2_DOWN (GADGET_ID_COUNTER_FIRST + 27) +#define GADGET_ID_ELEMENT_VALUE2_TEXT (GADGET_ID_COUNTER_FIRST + 28) +#define GADGET_ID_ELEMENT_VALUE2_UP (GADGET_ID_COUNTER_FIRST + 29) +#define GADGET_ID_ELEMENT_VALUE3_DOWN (GADGET_ID_COUNTER_FIRST + 30) +#define GADGET_ID_ELEMENT_VALUE3_TEXT (GADGET_ID_COUNTER_FIRST + 31) +#define GADGET_ID_ELEMENT_VALUE3_UP (GADGET_ID_COUNTER_FIRST + 32) +#define GADGET_ID_ELEMENT_VALUE4_DOWN (GADGET_ID_COUNTER_FIRST + 33) +#define GADGET_ID_ELEMENT_VALUE4_TEXT (GADGET_ID_COUNTER_FIRST + 34) +#define GADGET_ID_ELEMENT_VALUE4_UP (GADGET_ID_COUNTER_FIRST + 35) +#define GADGET_ID_YAMYAM_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 36) +#define GADGET_ID_YAMYAM_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 37) +#define GADGET_ID_YAMYAM_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 38) +#define GADGET_ID_BALL_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 39) +#define GADGET_ID_BALL_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 40) +#define GADGET_ID_BALL_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 41) +#define GADGET_ID_ANDROID_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 42) +#define GADGET_ID_ANDROID_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 43) +#define GADGET_ID_ANDROID_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 44) +#define GADGET_ID_ENVELOPE_XSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 45) +#define GADGET_ID_ENVELOPE_XSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 46) +#define GADGET_ID_ENVELOPE_XSIZE_UP (GADGET_ID_COUNTER_FIRST + 47) +#define GADGET_ID_ENVELOPE_YSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 48) +#define GADGET_ID_ENVELOPE_YSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 49) +#define GADGET_ID_ENVELOPE_YSIZE_UP (GADGET_ID_COUNTER_FIRST + 50) +#define GADGET_ID_INVENTORY_SIZE_DOWN (GADGET_ID_COUNTER_FIRST + 51) +#define GADGET_ID_INVENTORY_SIZE_TEXT (GADGET_ID_COUNTER_FIRST + 52) +#define GADGET_ID_INVENTORY_SIZE_UP (GADGET_ID_COUNTER_FIRST + 53) +#define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 54) +#define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 55) +#define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 56) +#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 57) +#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 58) +#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 59) +#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 60) +#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 61) +#define GADGET_ID_CUSTOM_VALUE_FIX_UP (GADGET_ID_COUNTER_FIRST + 62) +#define GADGET_ID_CUSTOM_VALUE_RND_DOWN (GADGET_ID_COUNTER_FIRST + 63) +#define GADGET_ID_CUSTOM_VALUE_RND_TEXT (GADGET_ID_COUNTER_FIRST + 64) +#define GADGET_ID_CUSTOM_VALUE_RND_UP (GADGET_ID_COUNTER_FIRST + 65) +#define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 66) +#define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 67) +#define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 68) +#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 69) +#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 70) +#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 71) +#define GADGET_ID_DROP_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 72) +#define GADGET_ID_DROP_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 73) +#define GADGET_ID_DROP_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 74) +#define GADGET_ID_DROP_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 75) +#define GADGET_ID_DROP_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 76) +#define GADGET_ID_DROP_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 77) +#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 78) +#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 79) +#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 80) +#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 81) +#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 82) +#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 83) +#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 84) +#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 85) +#define GADGET_ID_EXPLOSION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 86) +#define GADGET_ID_IGNITION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 87) +#define GADGET_ID_IGNITION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 88) +#define GADGET_ID_IGNITION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 89) +#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 90) +#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 91) +#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 92) +#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 93) +#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 94) +#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 95) +#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 96) +#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 97) +#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 98) +#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 99) +#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 100) +#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 101) /* drawing area identifiers */ -#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 96) +#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 102) #define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0) #define GADGET_ID_YAMYAM_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1) @@ -449,18 +466,20 @@ #define GADGET_ID_START_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 19) #define GADGET_ID_ARTWORK_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 20) #define GADGET_ID_EXPLOSION_ELEMENT (GADGET_ID_DRAWING_AREA_FIRST + 21) -#define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 22) -#define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 23) -#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 24) -#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 25) -#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 26) -#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 27) -#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 28) -#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 29) -#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 30) +#define GADGET_ID_INVENTORY_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 22) +#define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 23) +#define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 24) +#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 25) +#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 26) +#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 27) +#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 28) +#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 29) +#define GADGET_ID_CUSTOM_CHANGE_ACTION (GADGET_ID_DRAWING_AREA_FIRST + 30) +#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 31) +#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 32) /* text input identifiers */ -#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 31) +#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 33) #define GADGET_ID_LEVEL_NAME (GADGET_ID_TEXT_INPUT_FIRST + 0) #define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1) @@ -507,17 +526,19 @@ /* textbutton identifiers */ #define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 29) -#define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) -#define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) -#define GADGET_ID_PROPERTIES_CONFIG_1 (GADGET_ID_TEXTBUTTON_FIRST + 2) -#define GADGET_ID_PROPERTIES_CONFIG_2 (GADGET_ID_TEXTBUTTON_FIRST + 3) -#define GADGET_ID_PROPERTIES_CHANGE (GADGET_ID_TEXTBUTTON_FIRST + 4) -#define GADGET_ID_SAVE_AS_TEMPLATE (GADGET_ID_TEXTBUTTON_FIRST + 5) -#define GADGET_ID_ADD_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 6) -#define GADGET_ID_DEL_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 7) +#define GADGET_ID_LEVELINFO_LEVEL (GADGET_ID_TEXTBUTTON_FIRST + 0) +#define GADGET_ID_LEVELINFO_EDITOR (GADGET_ID_TEXTBUTTON_FIRST + 1) +#define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 2) +#define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 3) +#define GADGET_ID_PROPERTIES_CONFIG_1 (GADGET_ID_TEXTBUTTON_FIRST + 4) +#define GADGET_ID_PROPERTIES_CONFIG_2 (GADGET_ID_TEXTBUTTON_FIRST + 5) +#define GADGET_ID_PROPERTIES_CHANGE (GADGET_ID_TEXTBUTTON_FIRST + 6) +#define GADGET_ID_SAVE_AS_TEMPLATE (GADGET_ID_TEXTBUTTON_FIRST + 7) +#define GADGET_ID_ADD_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 8) +#define GADGET_ID_DEL_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 9) /* graphicbutton identifiers */ -#define GADGET_ID_GRAPHICBUTTON_FIRST (GADGET_ID_TEXTBUTTON_FIRST + 8) +#define GADGET_ID_GRAPHICBUTTON_FIRST (GADGET_ID_TEXTBUTTON_FIRST + 10) #define GADGET_ID_PREV_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 0) #define GADGET_ID_NEXT_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 1) @@ -549,54 +570,57 @@ #define GADGET_ID_RANDOM_RESTRICTED (GADGET_ID_CHECKBUTTON_FIRST + 2) #define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 3) #define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 4) -#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 5) -#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 6) -#define GADGET_ID_RANDOM_BALL_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 7) -#define GADGET_ID_INITIAL_BALL_STATE (GADGET_ID_CHECKBUTTON_FIRST + 8) -#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 9) -#define GADGET_ID_CONTINUOUS_SNAPPING (GADGET_ID_CHECKBUTTON_FIRST + 10) -#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 11) -#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12) -#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 13) -#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 14) -#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 15) -#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 16) -#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 18) -#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 19) -#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 24) -#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 25) -#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 26) -#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 27) -#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 28) -#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 29) -#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 30) -#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 31) -#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 32) -#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 33) -#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 34) -#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 35) -#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 36) -#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 37) -#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 38) -#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 39) -#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 40) -#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 41) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 42) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 43) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 44) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 45) -#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 46) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 47) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 48) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 49) +#define GADGET_ID_EM_EXPLODES_BY_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 5) +#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 6) +#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 7) +#define GADGET_ID_RANDOM_BALL_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 8) +#define GADGET_ID_INITIAL_BALL_STATE (GADGET_ID_CHECKBUTTON_FIRST + 9) +#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 10) +#define GADGET_ID_CONTINUOUS_SNAPPING (GADGET_ID_CHECKBUTTON_FIRST + 11) +#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 12) +#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 13) +#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 14) +#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 15) +#define GADGET_ID_SHIFTED_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 16) +#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 17) +#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 18) +#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 19) +#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 20) +#define GADGET_ID_USE_INITIAL_INVENTORY (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 22) +#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 23) +#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 28) +#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 29) +#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 30) +#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 31) +#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 32) +#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 33) +#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 34) +#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 35) +#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 36) +#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 37) +#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 38) +#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 39) +#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 40) +#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 41) +#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 42) +#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 43) +#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 44) +#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 45) +#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 46) +#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 47) +#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 48) +#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 49) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 50) +#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 51) +#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 52) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 50) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 53) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -614,37 +638,41 @@ #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_VALUE1 7 -#define ED_COUNTER_ID_ELEMENT_VALUE2 8 -#define ED_COUNTER_ID_ELEMENT_VALUE3 9 -#define ED_COUNTER_ID_ELEMENT_VALUE4 10 -#define ED_COUNTER_ID_YAMYAM_CONTENT 11 -#define ED_COUNTER_ID_BALL_CONTENT 12 -#define ED_COUNTER_ID_ANDROID_CONTENT 13 -#define ED_COUNTER_ID_ENVELOPE_XSIZE 14 -#define ED_COUNTER_ID_ENVELOPE_YSIZE 15 -#define ED_COUNTER_ID_CUSTOM_SCORE 16 -#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 17 -#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 18 -#define ED_COUNTER_ID_CUSTOM_VALUE_RND 19 -#define ED_COUNTER_ID_PUSH_DELAY_FIX 20 -#define ED_COUNTER_ID_PUSH_DELAY_RND 21 -#define ED_COUNTER_ID_DROP_DELAY_FIX 22 -#define ED_COUNTER_ID_DROP_DELAY_RND 23 -#define ED_COUNTER_ID_MOVE_DELAY_FIX 24 -#define ED_COUNTER_ID_MOVE_DELAY_RND 25 -#define ED_COUNTER_ID_EXPLOSION_DELAY 26 -#define ED_COUNTER_ID_IGNITION_DELAY 27 -#define ED_COUNTER_ID_GROUP_CONTENT 28 -#define ED_COUNTER_ID_CHANGE_DELAY_FIX 29 -#define ED_COUNTER_ID_CHANGE_DELAY_RND 30 -#define ED_COUNTER_ID_CHANGE_CONT_RND 31 - -#define ED_NUM_COUNTERBUTTONS 32 +#define ED_COUNTER_ID_LEVEL_RANDOM_SEED 6 +#define ED_COUNTER_ID_LEVEL_RANDOM 7 +#define ED_COUNTER_ID_ELEMENT_VALUE1 8 +#define ED_COUNTER_ID_ELEMENT_VALUE2 9 +#define ED_COUNTER_ID_ELEMENT_VALUE3 10 +#define ED_COUNTER_ID_ELEMENT_VALUE4 11 +#define ED_COUNTER_ID_YAMYAM_CONTENT 12 +#define ED_COUNTER_ID_BALL_CONTENT 13 +#define ED_COUNTER_ID_ANDROID_CONTENT 14 +#define ED_COUNTER_ID_ENVELOPE_XSIZE 15 +#define ED_COUNTER_ID_ENVELOPE_YSIZE 16 +#define ED_COUNTER_ID_INVENTORY_SIZE 17 +#define ED_COUNTER_ID_CUSTOM_SCORE 18 +#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 19 +#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 20 +#define ED_COUNTER_ID_CUSTOM_VALUE_RND 21 +#define ED_COUNTER_ID_PUSH_DELAY_FIX 22 +#define ED_COUNTER_ID_PUSH_DELAY_RND 23 +#define ED_COUNTER_ID_DROP_DELAY_FIX 24 +#define ED_COUNTER_ID_DROP_DELAY_RND 25 +#define ED_COUNTER_ID_MOVE_DELAY_FIX 26 +#define ED_COUNTER_ID_MOVE_DELAY_RND 27 +#define ED_COUNTER_ID_EXPLOSION_DELAY 28 +#define ED_COUNTER_ID_IGNITION_DELAY 29 +#define ED_COUNTER_ID_GROUP_CONTENT 30 +#define ED_COUNTER_ID_CHANGE_DELAY_FIX 31 +#define ED_COUNTER_ID_CHANGE_DELAY_RND 32 +#define ED_COUNTER_ID_CHANGE_CONT_RND 33 + +#define ED_NUM_COUNTERBUTTONS 34 #define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE -#define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM +#define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM_SEED +#define ED_COUNTER_ID_EDITOR_FIRST ED_COUNTER_ID_LEVEL_RANDOM +#define ED_COUNTER_ID_EDITOR_LAST ED_COUNTER_ID_LEVEL_RANDOM #define ED_COUNTER_ID_CUSTOM1_FIRST ED_COUNTER_ID_CUSTOM_SCORE #define ED_COUNTER_ID_CUSTOM1_LAST ED_COUNTER_ID_DROP_DELAY_RND @@ -744,16 +772,21 @@ #define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_SELECT_CHANGE_PAGE /* values for textbutton gadgets */ -#define ED_TEXTBUTTON_ID_PROPERTIES_INFO 0 -#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG 1 -#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1 2 -#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2 3 -#define ED_TEXTBUTTON_ID_PROPERTIES_CHANGE 4 -#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE 5 -#define ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE 6 -#define ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE 7 - -#define ED_NUM_TEXTBUTTONS 8 +#define ED_TEXTBUTTON_ID_LEVELINFO_LEVEL 0 +#define ED_TEXTBUTTON_ID_LEVELINFO_EDITOR 1 +#define ED_TEXTBUTTON_ID_PROPERTIES_INFO 2 +#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG 3 +#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1 4 +#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2 5 +#define ED_TEXTBUTTON_ID_PROPERTIES_CHANGE 6 +#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE 7 +#define ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE 8 +#define ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE 9 + +#define ED_NUM_TEXTBUTTONS 10 + +#define ED_TEXTBUTTON_ID_LEVELINFO_FIRST ED_TEXTBUTTON_ID_LEVELINFO_LEVEL +#define ED_TEXTBUTTON_ID_LEVELINFO_LAST ED_TEXTBUTTON_ID_LEVELINFO_EDITOR #define ED_TEXTBUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO #define ED_TEXTBUTTON_ID_PROPERTIES_LAST ED_TEXTBUTTON_ID_PROPERTIES_CHANGE @@ -776,56 +809,59 @@ #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 0 #define ED_CHECKBUTTON_ID_STICK_ELEMENT 1 #define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 2 -#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 3 -#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 4 -#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 5 -#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 6 -#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 7 -#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 8 -#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 9 -#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 10 -#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 11 -#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 12 -#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 13 -#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 14 -#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 15 -#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 16 -#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 17 -#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 18 -#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 19 -#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 20 -#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 21 -#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 22 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 23 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 24 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 25 -#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 26 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 27 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 28 -#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 29 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 30 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 31 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 32 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 33 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 34 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 35 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 36 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 37 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 38 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 39 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 40 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 41 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 42 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 43 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 44 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 45 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 46 -#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 47 - -#define ED_NUM_CHECKBUTTONS 48 - -#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED -#define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED +#define ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE 3 +#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 4 +#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 5 +#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 6 +#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 7 +#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 8 +#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 9 +#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 10 +#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 11 +#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 12 +#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 13 +#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION 14 +#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 15 +#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 16 +#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 17 +#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 18 +#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY 19 +#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 20 +#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 21 +#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 22 +#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 23 +#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 24 +#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 25 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 26 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 27 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 28 +#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 29 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 30 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 31 +#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 32 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 33 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 34 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 35 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 36 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 37 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 38 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 39 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 40 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 41 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 42 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 43 +#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 44 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 45 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 46 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 47 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 48 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 49 +#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 50 + +#define ED_NUM_CHECKBUTTONS 51 + +#define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED +#define ED_CHECKBUTTON_ID_EDITOR_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC #define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE @@ -843,8 +879,8 @@ #define ED_NUM_RADIOBUTTONS 2 -#define ED_RADIOBUTTON_ID_LEVEL_FIRST ED_RADIOBUTTON_ID_PERCENTAGE -#define ED_RADIOBUTTON_ID_LEVEL_LAST ED_RADIOBUTTON_ID_QUANTITY +#define ED_RADIOBUTTON_ID_EDITOR_FIRST ED_RADIOBUTTON_ID_PERCENTAGE +#define ED_RADIOBUTTON_ID_EDITOR_LAST ED_RADIOBUTTON_ID_QUANTITY /* values for drawing area gadgets */ #define ED_DRAWING_ID_DRAWING_LEVEL 0 @@ -869,17 +905,19 @@ #define ED_DRAWING_ID_START_ELEMENT 19 #define ED_DRAWING_ID_ARTWORK_ELEMENT 20 #define ED_DRAWING_ID_EXPLOSION_ELEMENT 21 -#define ED_DRAWING_ID_CUSTOM_GRAPHIC 22 -#define ED_DRAWING_ID_CUSTOM_CONTENT 23 -#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 24 -#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 25 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 26 -#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 27 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 28 -#define ED_DRAWING_ID_GROUP_CONTENT 29 -#define ED_DRAWING_ID_RANDOM_BACKGROUND 30 +#define ED_DRAWING_ID_INVENTORY_CONTENT 22 +#define ED_DRAWING_ID_CUSTOM_GRAPHIC 23 +#define ED_DRAWING_ID_CUSTOM_CONTENT 24 +#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 25 +#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 26 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 27 +#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 28 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 29 +#define ED_DRAWING_ID_CUSTOM_CHANGE_ACTION 30 +#define ED_DRAWING_ID_GROUP_CONTENT 31 +#define ED_DRAWING_ID_RANDOM_BACKGROUND 32 -#define ED_NUM_DRAWING_AREAS 31 +#define ED_NUM_DRAWING_AREAS 33 /* @@ -904,6 +942,10 @@ #define ED_MODE_INFO 1 #define ED_MODE_PROPERTIES 2 +/* sub-screens in the global settings section */ +#define ED_MODE_LEVELINFO_LEVEL ED_TEXTBUTTON_ID_LEVELINFO_LEVEL +#define ED_MODE_LEVELINFO_EDITOR ED_TEXTBUTTON_ID_LEVELINFO_EDITOR + /* sub-screens in the element properties section */ #define ED_MODE_PROPERTIES_INFO ED_TEXTBUTTON_ID_PROPERTIES_INFO #define ED_MODE_PROPERTIES_CONFIG ED_TEXTBUTTON_ID_PROPERTIES_CONFIG @@ -916,11 +958,11 @@ /* values for elements with score for certain actions */ #define MIN_SCORE 0 -#define MAX_SCORE 255 +#define MAX_SCORE 999 /* values for elements with count for collecting */ #define MIN_COLLECT_COUNT 0 -#define MAX_COLLECT_COUNT 255 +#define MAX_COLLECT_COUNT 999 /* values for random placement */ #define RANDOM_USE_PERCENTAGE 0 @@ -964,7 +1006,7 @@ static struct { ',', "pick drawing element" }, { 'U', "undo last operation" }, - { 'I', "level properties" }, + { 'I', "properties of level" }, { 'S', "save level" }, { 'C', "clear level" }, { 'T', "test level" }, @@ -1035,7 +1077,7 @@ static struct GADGET_ID_LEVEL_GEMSLIMIT_DOWN, GADGET_ID_LEVEL_GEMSLIMIT_UP, GADGET_ID_LEVEL_GEMSLIMIT_TEXT, GADGET_ID_NONE, &level.gems_needed, - NULL, "number of gems to collect:", NULL + NULL, "number of gems to collect:", NULL }, { ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(7), @@ -1047,14 +1089,22 @@ static struct }, { ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(9), - 0, 255, + 0, 999, GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP, GADGET_ID_LEVEL_TIMESCORE_TEXT, GADGET_ID_NONE, &level.score[SC_TIME_BONUS], "score for each second/step left:", NULL, NULL }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(8), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(12), + 0, 9999, + GADGET_ID_LEVEL_RANDOM_SEED_DOWN, GADGET_ID_LEVEL_RANDOM_SEED_UP, + GADGET_ID_LEVEL_RANDOM_SEED_TEXT, GADGET_ID_NONE, + &level.random_seed, + NULL, "random seed:", "(0 => random)" + }, + { + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0), 1, 100, GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP, GADGET_ID_LEVEL_RANDOM_TEXT, GADGET_ID_NONE, @@ -1136,6 +1186,14 @@ static struct NULL, /* will be set when used */ NULL, " ", "height", }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), + MIN_INITIAL_INVENTORY_SIZE, MAX_INITIAL_INVENTORY_SIZE, + GADGET_ID_INVENTORY_SIZE_DOWN, GADGET_ID_INVENTORY_SIZE_UP, + GADGET_ID_INVENTORY_SIZE_TEXT, GADGET_ID_NONE, + &level.initial_inventory_size[0], + NULL, NULL, "number of inventory elements" + }, /* ---------- element settings: configure 1 (custom elements) ------------ */ @@ -1173,7 +1231,7 @@ static struct }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(7), - 0, 255, + 0, 999, GADGET_ID_PUSH_DELAY_FIX_DOWN, GADGET_ID_PUSH_DELAY_FIX_UP, GADGET_ID_PUSH_DELAY_FIX_TEXT, GADGET_ID_NONE, &custom_element.push_delay_fixed, @@ -1181,7 +1239,7 @@ static struct }, { -1, ED_ELEMENT_SETTINGS_YPOS(7), - 0, 255, + 0, 999, GADGET_ID_PUSH_DELAY_RND_DOWN, GADGET_ID_PUSH_DELAY_RND_UP, GADGET_ID_PUSH_DELAY_RND_TEXT, GADGET_ID_PUSH_DELAY_FIX_UP, &custom_element.push_delay_random, @@ -1189,7 +1247,7 @@ static struct }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(8), - 0, 255, + 0, 999, GADGET_ID_DROP_DELAY_FIX_DOWN, GADGET_ID_DROP_DELAY_FIX_UP, GADGET_ID_DROP_DELAY_FIX_TEXT, GADGET_ID_NONE, &custom_element.drop_delay_fixed, @@ -1197,7 +1255,7 @@ static struct }, { -1, ED_ELEMENT_SETTINGS_YPOS(8), - 0, 255, + 0, 999, GADGET_ID_DROP_DELAY_RND_DOWN, GADGET_ID_DROP_DELAY_RND_UP, GADGET_ID_DROP_DELAY_RND_TEXT, GADGET_ID_DROP_DELAY_FIX_UP, &custom_element.drop_delay_random, @@ -1224,7 +1282,7 @@ static struct }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(12), - 0, 255, + 0, 999, GADGET_ID_EXPLOSION_DELAY_DOWN, GADGET_ID_EXPLOSION_DELAY_UP, GADGET_ID_EXPLOSION_DELAY_TEXT, GADGET_ID_NONE, &custom_element.explosion_delay, @@ -1232,7 +1290,7 @@ static struct }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13), - 0, 255, + 0, 999, GADGET_ID_IGNITION_DELAY_DOWN, GADGET_ID_IGNITION_DELAY_UP, GADGET_ID_IGNITION_DELAY_TEXT, GADGET_ID_NONE, &custom_element.ignition_delay, @@ -1340,6 +1398,7 @@ static struct ValueTextInfo options_game_engine_type[] = { { GAME_ENGINE_TYPE_RND, "Rocks'n'Diamonds" }, { GAME_ENGINE_TYPE_EM, "Emerald Mine" }, + { GAME_ENGINE_TYPE_SP, "Supaplex" }, { -1, NULL } }; @@ -1513,6 +1572,7 @@ static struct ValueTextInfo options_deadliness[] = { { EP_DONT_RUN_INTO, "running into" }, { EP_DONT_COLLIDE_WITH, "colliding with" }, + { EP_DONT_GET_HIT_BY, "getting hit by" }, { EP_DONT_TOUCH, "touching" }, { -1, NULL } @@ -1671,15 +1731,16 @@ static struct ValueTextInfo options_action_type[] = { { CA_NO_ACTION, "no action" }, { CA_UNDEFINED, " " }, - { CA_HEADLINE_LEVEL_ACTIONS, "[level actions]" }, + { CA_HEADLINE_LEVEL_ACTIONS, "[level]" }, { CA_RESTART_LEVEL, "restart level" }, { CA_SHOW_ENVELOPE, "show envelope" }, { CA_SET_LEVEL_TIME, "set time" }, { CA_SET_LEVEL_SCORE, "set score" }, - { CA_SET_LEVEL_GEMS, "set needed gems" }, + { CA_SET_LEVEL_GEMS, "set gems" }, { CA_SET_LEVEL_WIND, "set wind dir." }, + { CA_SET_LEVEL_RANDOM_SEED, "set rand. seed" }, { CA_UNDEFINED, " " }, - { CA_HEADLINE_PLAYER_ACTIONS, "[player actions]" }, + { CA_HEADLINE_PLAYER_ACTIONS, "[player]" }, { CA_MOVE_PLAYER, "move player" }, { CA_EXIT_PLAYER, "exit player" }, { CA_KILL_PLAYER, "kill player" }, @@ -1688,12 +1749,14 @@ static struct ValueTextInfo options_action_type[] = { CA_SET_PLAYER_SHIELD, "set shield" }, { CA_SET_PLAYER_GRAVITY, "set gravity" }, { CA_SET_PLAYER_ARTWORK, "set artwork" }, + { CA_SET_PLAYER_INVENTORY, "set inventory" }, { CA_UNDEFINED, " " }, - { CA_HEADLINE_CE_ACTIONS, "[CE actions]" }, + { CA_HEADLINE_CE_ACTIONS, "[CE]" }, { CA_SET_CE_VALUE, "set CE value" }, { CA_SET_CE_SCORE, "set CE score" }, + { CA_SET_CE_ARTWORK, "set CE artwork" }, { CA_UNDEFINED, " " }, - { CA_HEADLINE_ENGINE_ACTIONS, "[engine actions]" }, + { CA_HEADLINE_ENGINE_ACTIONS, "[engine]" }, { CA_SET_ENGINE_SCAN_MODE, "set scan mode" }, { -1, NULL } @@ -1749,6 +1812,7 @@ static struct ValueTextInfo options_action_arg_player[] = { CA_ARG_PLAYER_4, "4" }, { CA_ARG_PLAYER_ANY, "any" }, { CA_ARG_PLAYER_TRIGGER, "trigger" }, + { CA_ARG_PLAYER_ACTION, "action ->" }, { -1, NULL } }; @@ -1782,10 +1846,12 @@ static struct ValueTextInfo options_action_arg_number[] = { CA_ARG_ELEMENT_CV_HEADLINE, "[CE value]" }, { CA_ARG_ELEMENT_CV_TARGET, "target" }, { CA_ARG_ELEMENT_CV_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_CV_ACTION, "action ->" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_CS_HEADLINE, "[CE score]" }, { CA_ARG_ELEMENT_CS_TARGET, "target" }, { CA_ARG_ELEMENT_CS_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_CS_ACTION, "action ->" }, { -1, NULL } }; @@ -1819,14 +1885,17 @@ static struct ValueTextInfo options_action_arg_value[] = { CA_ARG_ELEMENT_CV_HEADLINE, "[CE value]" }, { CA_ARG_ELEMENT_CV_TARGET, "target" }, { CA_ARG_ELEMENT_CV_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_CV_ACTION, "action ->" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_CS_HEADLINE, "[CE score]" }, { CA_ARG_ELEMENT_CS_TARGET, "target" }, { CA_ARG_ELEMENT_CS_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_CS_ACTION, "action ->" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_NR_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_NR_TARGET, "target" }, { CA_ARG_ELEMENT_NR_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_NR_ACTION, "action ->" }, { -1, NULL } }; @@ -1842,6 +1911,7 @@ static struct ValueTextInfo options_action_arg_envelope[] = { CA_ARG_ELEMENT_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_TARGET, "target" }, { CA_ARG_ELEMENT_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_ACTION, "action ->" }, { -1, NULL } }; @@ -1861,6 +1931,7 @@ static struct ValueTextInfo options_action_arg_key[] = { CA_ARG_ELEMENT_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_TARGET, "target" }, { CA_ARG_ELEMENT_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_ACTION, "action ->" }, { -1, NULL } }; @@ -1899,6 +1970,7 @@ static struct ValueTextInfo options_action_arg_artwork[] = { CA_ARG_ELEMENT_HEADLINE, "[element]" }, { CA_ARG_ELEMENT_TARGET, "target" }, { CA_ARG_ELEMENT_TRIGGER, "trigger" }, + { CA_ARG_ELEMENT_ACTION, "action ->" }, { CA_ARG_UNDEFINED, " " }, { CA_ARG_ELEMENT_RESET, "reset" }, @@ -1938,6 +2010,26 @@ static struct ValueTextInfo options_action_arg_scan_mode[] = { -1, NULL } }; +static struct ValueTextInfo options_action_arg_inventory[] = +{ + { CA_ARG_INVENTORY_HEADLINE, "[add]" }, + { CA_ARG_ELEMENT_TARGET, "+ target" }, + { CA_ARG_ELEMENT_TRIGGER, "+ trigger" }, + { CA_ARG_ELEMENT_ACTION, "+ action" }, + { CA_ARG_UNDEFINED, " " }, + { CA_ARG_INVENTORY_RM_HEADLINE,"[remove]" }, + { CA_ARG_INVENTORY_RM_TARGET, "- target" }, + { CA_ARG_INVENTORY_RM_TRIGGER,"- trigger" }, + { CA_ARG_INVENTORY_RM_ACTION, "- action" }, + { CA_ARG_INVENTORY_RM_FIRST, "- first" }, + { CA_ARG_INVENTORY_RM_LAST, "- last" }, + { CA_ARG_INVENTORY_RM_ALL, "- all" }, + { CA_ARG_UNDEFINED, " " }, + { CA_ARG_INVENTORY_RESET, "reset" }, + + { -1, NULL } +}; + static char options_change_page_strings[MAX_CHANGE_PAGES][10]; static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] = { @@ -1981,13 +2073,16 @@ action_arg_options[] = { CA_SET_LEVEL_GEMS, 3, options_action_arg_number, }, { CA_SET_LEVEL_SCORE, 3, options_action_arg_number, }, { CA_SET_LEVEL_WIND, 1, options_action_arg_direction, }, + { CA_SET_LEVEL_RANDOM_SEED, 1, options_action_arg_number, }, { CA_SET_PLAYER_KEYS, 2, options_action_arg_key, }, { CA_SET_PLAYER_SPEED, 1, options_action_arg_speed, }, { CA_SET_PLAYER_SHIELD, 1, options_action_arg_shield, }, { CA_SET_PLAYER_GRAVITY, 1, options_action_arg_gravity, }, { CA_SET_PLAYER_ARTWORK, 1, options_action_arg_artwork, }, + { CA_SET_PLAYER_INVENTORY, 0, options_action_arg_inventory, }, { CA_SET_CE_VALUE, 3, options_action_arg_value, }, { CA_SET_CE_SCORE, 3, options_action_arg_value, }, + { CA_SET_CE_ARTWORK, 1, options_action_arg_artwork, }, { CA_SET_ENGINE_SCAN_MODE, 1, options_action_arg_scan_mode, }, { -1, FALSE, NULL } @@ -2034,7 +2129,7 @@ static struct /* ---------- element settings: configure (several elements) ------------- */ { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6), GADGET_ID_PLAYER_SPEED, GADGET_ID_NONE, -1, options_player_speed, @@ -2266,34 +2361,46 @@ static struct } textbutton_info[ED_NUM_TEXTBUTTONS] = { { - ED_ELEMENT_SETTINGS_XPOS(0), ED_COUNTER_YPOS(1), + ED_LEVEL_SETTINGS_TABS_XPOS(0), ED_LEVEL_SETTINGS_TABS_YPOS(0), + GADGET_ID_LEVELINFO_LEVEL, GADGET_ID_NONE, + 8, "Level", + NULL, NULL, "Configure level properties" + }, + { + ED_LEVEL_SETTINGS_TABS_XPOS(1), ED_LEVEL_SETTINGS_TABS_YPOS(0), + GADGET_ID_LEVELINFO_EDITOR, GADGET_ID_NONE, + 8, "Editor", + NULL, NULL, "Configure editor properties" + }, + { + ED_ELEMENT_SETTINGS_TABS_XPOS(0), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE, 8, "Info", NULL, NULL, "Show information about element" }, { - ED_ELEMENT_SETTINGS_XPOS(0) + 124, ED_COUNTER_YPOS(1), + ED_ELEMENT_SETTINGS_TABS_XPOS(1), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_NONE, 8, "Config", NULL, NULL, "Configure element properties" }, { - ED_ELEMENT_SETTINGS_XPOS(0) + 124, ED_COUNTER_YPOS(1), + ED_ELEMENT_SETTINGS_TABS_XPOS(1), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_CONFIG_1, GADGET_ID_NONE, 8, "Config 1", - NULL, NULL, "Configure custom element properties" + NULL, NULL, "Configure element properties, part 1" }, { - ED_ELEMENT_SETTINGS_XPOS(0) + 248, ED_COUNTER_YPOS(1), + ED_ELEMENT_SETTINGS_TABS_XPOS(2), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_CONFIG_2, GADGET_ID_NONE, 8, "Config 2", - NULL, NULL, "Configure custom element properties" + NULL, NULL, "Configure element properties, part 2" }, { - ED_ELEMENT_SETTINGS_XPOS(0) + 372, ED_COUNTER_YPOS(1), + ED_ELEMENT_SETTINGS_TABS_XPOS(3), ED_ELEMENT_SETTINGS_TABS_YPOS(0), GADGET_ID_PROPERTIES_CHANGE, GADGET_ID_NONE, 8, "Change", - NULL, NULL, "Custom element change configuration" + NULL, NULL, "Configure custom element change pages" }, { -1, ED_ELEMENT_SETTINGS_YPOS(2), @@ -2472,14 +2579,14 @@ static struct } radiobutton_info[ED_NUM_RADIOBUTTONS] = { { - -1, ED_COUNTER2_YPOS(8), + -1, ED_LEVEL_SETTINGS_YPOS(0), 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" }, { - -1, ED_COUNTER2_YPOS(8), + -1, ED_LEVEL_SETTINGS_YPOS(0), GADGET_ID_RANDOM_QUANTITY, GADGET_ID_RANDOM_PERCENTAGE, RADIO_NR_RANDOM_ELEMENTS, &random_placement_method, RANDOM_USE_QUANTITY, @@ -2499,7 +2606,7 @@ static struct /* ---------- level and editor settings ---------------------------------- */ { - ED_LEVEL_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(9) - MINI_TILEY, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(1), GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_NONE, &random_placement_background_restricted, NULL, @@ -2522,6 +2629,13 @@ static struct NULL, "slip down from certain flat walls","use EM/DC style slipping behaviour" }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_EM_EXPLODES_BY_FIRE, GADGET_ID_NONE, + &level.em_explodes_by_fire, + NULL, + "explodes with chain reaction", "use R'n'D style explosion behaviour" + }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_USE_SPRING_BUG, GADGET_ID_NONE, @@ -2558,14 +2672,14 @@ static struct "can grow into anything diggable", "grow into more than just sand" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CONTINUOUS_SNAPPING, GADGET_ID_NONE, &level.continuous_snapping, NULL, "continuos snapping", "use snapping without releasing key" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7), GADGET_ID_BLOCK_SNAP_FIELD, GADGET_ID_NONE, &level.block_snap_field, NULL, @@ -2593,35 +2707,49 @@ static struct "no scrolling when relocating", "player gets relocated without delay" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), + GADGET_ID_SHIFTED_RELOCATION, GADGET_ID_NONE, + &level.shifted_relocation, + NULL, + "no centering when relocating", "level not centered after relocation" + }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_USE_START_ELEMENT, GADGET_ID_NONE, &level.use_start_element[0], NULL, "use level start element:", "start level at this element's position" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), GADGET_ID_USE_ARTWORK_ELEMENT, GADGET_ID_NONE, &level.use_artwork_element[0], NULL, "use artwork from element:", "use player artwork from other element" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_USE_EXPLOSION_ELEMENT, GADGET_ID_NONE, &level.use_explosion_element[0], NULL, "use explosion from element:", "use explosion properties from element" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_INITIAL_GRAVITY, GADGET_ID_NONE, &level.initial_player_gravity[0], NULL, "use initial gravity", "set initial player gravity" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_USE_INITIAL_INVENTORY, GADGET_ID_NONE, + &level.use_initial_inventory[0], + NULL, + "use initial inventory:", "use collected elements on level start" + }, + { + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), GADGET_ID_CAN_PASS_TO_WALKABLE, GADGET_ID_NONE, &level.can_pass_to_walkable, NULL, @@ -2997,7 +3125,7 @@ static struct /* ---------- level start element ---------------------------------------- */ { - -1, ED_AREA_1X1_SETTINGS_YPOS(8), + -1, ED_AREA_1X1_SETTINGS_YPOS(9), GADGET_ID_START_ELEMENT, GADGET_ID_USE_START_ELEMENT, &level.start_element[0], 1, 1, NULL, NULL, NULL, "level start element" @@ -3006,7 +3134,7 @@ static struct /* ---------- player artwork element ------------------------------------- */ { - -1, ED_AREA_1X1_SETTINGS_YPOS(9), + -1, ED_AREA_1X1_SETTINGS_YPOS(10), GADGET_ID_ARTWORK_ELEMENT, GADGET_ID_USE_ARTWORK_ELEMENT, &level.artwork_element[0], 1, 1, NULL, NULL, NULL, "element for player artwork" @@ -3015,12 +3143,21 @@ static struct /* ---------- player explosion element ----------------------------------- */ { - -1, ED_AREA_1X1_SETTINGS_YPOS(10), + -1, ED_AREA_1X1_SETTINGS_YPOS(11), GADGET_ID_EXPLOSION_ELEMENT, GADGET_ID_USE_EXPLOSION_ELEMENT, &level.explosion_element[0], 1, 1, NULL, NULL, NULL, "element for player explosion" }, + /* ---------- player initial inventory ----------------------------------- */ + + { + -1, ED_AREA_1X1_SETTINGS_YPOS(1), + GADGET_ID_INVENTORY_CONTENT, GADGET_ID_USE_INITIAL_INVENTORY, + &level.initial_inventory_content[0][0], MAX_INITIAL_INVENTORY_SIZE, 1, + NULL, NULL, NULL, "content for initial inventory" + }, + /* ---------- element settings: configure 1 (custom elements) ----------- */ /* ---------- custom graphic --------------------------------------------- */ @@ -3028,7 +3165,7 @@ static struct { -1, ED_AREA_1X1_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_GRAPHIC, GADGET_ID_CUSTOM_USE_GRAPHIC, - &custom_element.gfx_element, 1, 1, + &custom_element.gfx_element_initial,1, 1, NULL, NULL, NULL, "custom graphic element" }, @@ -3083,10 +3220,19 @@ static struct { -1, ED_AREA_1X1_SETTINGS_YPOS(5), GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION, - &custom_element_change.trigger_element, 1, 1, + &custom_element_change.initial_trigger_element, 1, 1, NULL, NULL, NULL, "other element triggering change" }, + /* ---------- custom change action (element used for action) ------------- */ + + { + -1, ED_AREA_1X1_SETTINGS_YPOS(13), + GADGET_ID_CUSTOM_CHANGE_ACTION, GADGET_ID_ACTION_ARG, + &custom_element_change.action_element, 1, 1, + NULL, NULL, NULL, "element used as action parameter" + }, + /* ---------- group element content -------------------------------------- */ { @@ -3099,7 +3245,7 @@ static struct /* ---------- random background (for random painting) -------------------- */ { - -1, ED_ELEMENT_SETTINGS_YPOS(14), + -1, ED_AREA_1X1_SETTINGS_YPOS(-1), GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED, &random_placement_background_element, 1, 1, NULL, NULL, NULL, "random placement background" @@ -3119,7 +3265,11 @@ static int ed_fieldx = MAX_ED_FIELDX - 1, ed_fieldy = MAX_ED_FIELDY - 1; /* actual position of level editor drawing area in level playfield */ static int level_xpos = -1, level_ypos = -1; +#if 1 +#define IN_ED_FIELD(x,y) IN_FIELD(x, y, ed_fieldx, ed_fieldy) +#else #define IN_ED_FIELD(x,y) ((x)>=0 && (x)=0 &&(y)= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE) + if ((id >= GADGET_ID_LEVELINFO_LEVEL && id <= GADGET_ID_LEVELINFO_EDITOR) || + (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE)) { gd_x1 = DOOR_GFX_PAGEX4 + ED_TEXTBUTTON_TAB_XPOS; gd_x2 = DOOR_GFX_PAGEX3 + ED_TEXTBUTTON_TAB_XPOS; @@ -6561,8 +6744,11 @@ static void replace_custom_element_in_settings(int element_from, if (change->target_element == element_from) change->target_element = element_to; - if (change->trigger_element == element_from) - change->trigger_element = element_to; + if (change->initial_trigger_element == element_from) + change->initial_trigger_element = element_to; + + if (change->action_element == element_from) + change->action_element = element_to; for (y = 0; y < 3; y++) for (x = 0; x < 3; x++) @@ -6738,11 +6924,13 @@ static void CopyCustomElementPropertiesToEditor(int element) /* set deadliness selectbox help value */ custom_element.deadliness = (DONT_TOUCH(element) ? EP_DONT_TOUCH : + DONT_GET_HIT_BY(element) ? EP_DONT_GET_HIT_BY : DONT_COLLIDE_WITH(element) ? EP_DONT_COLLIDE_WITH : DONT_RUN_INTO(element) ? EP_DONT_RUN_INTO : custom_element.deadliness); custom_element_properties[EP_DEADLY] = (DONT_TOUCH(element) || + DONT_GET_HIT_BY(element) || DONT_COLLIDE_WITH(element) || DONT_RUN_INTO(element)); @@ -6890,6 +7078,7 @@ static void CopyCustomElementPropertiesToGame(int element) /* set deadliness property from checkbox and selectbox */ custom_element_properties[EP_DONT_RUN_INTO] = FALSE; custom_element_properties[EP_DONT_COLLIDE_WITH] = FALSE; + custom_element_properties[EP_DONT_GET_HIT_BY] = FALSE; custom_element_properties[EP_DONT_TOUCH] = FALSE; custom_element_properties[custom_element.deadliness] = custom_element_properties[EP_DEADLY]; @@ -6998,7 +7187,14 @@ void CheckElementDescriptions() void DrawLevelEd() { + StopAnimation(); + CloseDoor(DOOR_CLOSE_ALL); + +#if 1 + FadeOut(REDRAW_FIELD); +#endif + OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY); #if DEBUG @@ -7015,6 +7211,7 @@ void DrawLevelEd() else { edit_mode = ED_MODE_DRAWING; + edit_mode_levelinfo = ED_MODE_LEVELINFO_LEVEL; edit_mode_properties = ED_MODE_PROPERTIES_INFO; ResetUndoBuffer(); @@ -7039,6 +7236,8 @@ void DrawLevelEd() ReinitializeElementList(); /* update dynamic level element list */ ReinitializeElementListButtons(); /* custom element may look different */ + InitElementPropertiesGfxElement(); + #if 1 UnmapAllGadgets(); #else @@ -7046,12 +7245,26 @@ void DrawLevelEd() #endif MapControlButtons(); +#if 0 + FadeOut(REDRAW_FIELD); +#endif + DrawEditModeWindow(); +#if 1 + FadeIn(REDRAW_FIELD); +#endif + /* copy actual editor door content to door double buffer for OpenDoor() */ BlitBitmap(drawto, bitmap_db_door, DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); +#if 1 + /* draw new control window (with border) to window */ + redraw_mask |= REDRAW_ALL; + BackToFront(); +#endif + OpenDoor(DOOR_OPEN_1); } @@ -7304,7 +7517,7 @@ static void DrawDrawingWindow() stick_element_properties_window = FALSE; SetMainBackgroundImage(IMG_UNDEFINED); - ClearWindow(); + ClearField(); UnmapLevelEditorWindowGadgets(); UnmapLevelEditorToolboxCustomGadgets(); @@ -7320,62 +7533,202 @@ static void DrawDrawingWindow() MapLevelEditorToolboxDrawingGadgets(); } -static void DrawLevelInfoWindow() +static int getTabulatorBarWidth() { - int i; - - stick_element_properties_window = FALSE; + struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO]; + struct GadgetInfo *gd_gi4 = level_editor_gadget[GADGET_ID_PROPERTIES_CHANGE]; - SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); - ClearWindow(); - UnmapLevelEditorWindowGadgets(); + return gd_gi4->x - gd_gi1->x + gd_gi4->width; +} -#if 0 - DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Level Settings"); - DrawTextSCentered(ED_SETTINGS2_YPOS, FONT_TITLE_1, "Editor Settings"); +static void DrawLevelInfoTabulatorGadgets() +{ + struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL]; + struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED]; + int gd_x = gd->x + gd_gi1->border.width / 2; + int gd_y = gd->y + gd_gi1->height - 1; + Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y); + int id_first = ED_TEXTBUTTON_ID_LEVELINFO_LEVEL; + int id_last = ED_TEXTBUTTON_ID_LEVELINFO_EDITOR; +#if 1 #else - DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS, - "Level Settings", FONT_TITLE_1); - DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS, - "Editor Settings", FONT_TITLE_1); + int max_tabs = 2; #endif + int i; - /* draw counter gadgets */ - for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++) - MapCounterButtons(i); - - /* draw selectbox gadgets */ - for (i = ED_SELECTBOX_ID_LEVEL_FIRST; i <= ED_SELECTBOX_ID_LEVEL_LAST; i++) - MapSelectboxGadget(i); + for (i = id_first; i <= id_last; i++) + { + int gadget_id = textbutton_info[i].gadget_id; + struct GadgetInfo *gi = level_editor_gadget[gadget_id]; + boolean active = (i != edit_mode_levelinfo); - /* draw checkbutton gadgets */ - for (i=ED_CHECKBUTTON_ID_LEVEL_FIRST; i <= ED_CHECKBUTTON_ID_LEVEL_LAST; i++) - MapCheckbuttonGadget(i); + /* draw background line below tabulator button */ + ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1); - /* draw radiobutton gadgets */ - for (i=ED_RADIOBUTTON_ID_LEVEL_FIRST; i <= ED_RADIOBUTTON_ID_LEVEL_LAST; i++) - MapRadiobuttonGadget(i); + /* draw solid line below inactive tabulator buttons */ + if (!active && tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width, 1, tab_color); - /* draw text input gadgets */ - for (i = ED_TEXTINPUT_ID_LEVEL_FIRST; i <= ED_TEXTINPUT_ID_LEVEL_LAST; i++) - MapTextInputGadget(i); + ModifyGadget(gi, GDI_ACTIVE, active, GDI_END); + MapTextbuttonGadget(i); + } - /* draw drawing area */ - MapDrawingArea(ED_DRAWING_ID_RANDOM_BACKGROUND); +#if 1 + /* draw little border line below tabulator buttons */ + if (tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, + getTabulatorBarWidth(), ED_GADGET_DISTANCE, + tab_color); +#else + /* draw little border line below tabulator buttons */ + if (tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, + max_tabs * gd_gi1->width + (max_tabs -1) * ED_GADGET_DISTANCE, + ED_GADGET_DISTANCE, tab_color); +#endif } -static void DrawCustomContentArea() +static void DrawPropertiesTabulatorGadgets() { - int id = ED_DRAWING_ID_CUSTOM_CONTENT; - struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id]; - int x1 = right_gadget_border[GADGET_ID_CUSTOM_DEADLINESS]; - int x2 = right_gadget_border[GADGET_ID_CUSTOM_EXPLOSION_TYPE]; - int x3 = right_gadget_border[GADGET_ID_CUSTOM_EXPLODE_IMPACT]; - int xoffset = ED_DRAWINGAREA_TEXT_DISTANCE; - - /* add distance for potential left text (without drawing area border) */ - x2 += getTextWidthForGadget(drawingarea_info[id].text_left); - + struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO]; + struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED]; + int gd_x = gd->x + gd_gi1->border.width / 2; + int gd_y = gd->y + gd_gi1->height - 1; + Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y); + int id_first = ED_TEXTBUTTON_ID_PROPERTIES_INFO; + int id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG; +#if 1 +#else + int max_tabs = 4; +#endif + int i; + + /* draw two config tabulators for player elements */ + if (ELEM_IS_PLAYER(properties_element)) + id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2; + + /* draw two config and one "change" tabulator for custom elements */ + if (IS_CUSTOM_ELEMENT(properties_element)) + id_last = ED_TEXTBUTTON_ID_PROPERTIES_CHANGE; + + for (i = id_first; i <= id_last; i++) + { + int gadget_id = textbutton_info[i].gadget_id; + struct GadgetInfo *gi = level_editor_gadget[gadget_id]; + boolean active = (i != edit_mode_properties); + + /* use "config 1" and "config 2" instead of "config" for players and CEs */ + if (i == ED_TEXTBUTTON_ID_PROPERTIES_CONFIG && + (ELEM_IS_PLAYER(properties_element) || + IS_CUSTOM_ELEMENT(properties_element))) + continue; + + /* draw background line below tabulator button */ + ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1); + + /* draw solid line below inactive tabulator buttons */ + if (!active && tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width, 1, tab_color); + + ModifyGadget(gi, GDI_ACTIVE, active, GDI_END); + MapTextbuttonGadget(i); + } + +#if 1 + /* draw little border line below tabulator buttons */ + if (tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, + getTabulatorBarWidth(), ED_GADGET_DISTANCE, + tab_color); +#else + /* draw little border line below tabulator buttons */ + if (tab_color != BLACK_PIXEL) /* black => transparent */ + FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, + max_tabs * gd_gi1->width + (max_tabs -1) * ED_GADGET_DISTANCE, + ED_GADGET_DISTANCE, tab_color); +#endif +} + +static void DrawLevelInfoLevel() +{ + int i; + + /* draw counter gadgets */ + for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++) + MapCounterButtons(i); + + /* draw selectbox gadgets */ + for (i = ED_SELECTBOX_ID_LEVEL_FIRST; i <= ED_SELECTBOX_ID_LEVEL_LAST; i++) + MapSelectboxGadget(i); + + /* draw text input gadgets */ + for (i = ED_TEXTINPUT_ID_LEVEL_FIRST; i <= ED_TEXTINPUT_ID_LEVEL_LAST; i++) + MapTextInputGadget(i); +} + +static void DrawLevelInfoEditor() +{ + int i; + + /* draw counter gadgets */ + for (i = ED_COUNTER_ID_EDITOR_FIRST; i <= ED_COUNTER_ID_EDITOR_LAST; i++) + MapCounterButtons(i); + + /* draw checkbutton gadgets */ + for (i=ED_CHECKBUTTON_ID_EDITOR_FIRST; i<= ED_CHECKBUTTON_ID_EDITOR_LAST; i++) + MapCheckbuttonGadget(i); + + /* draw radiobutton gadgets */ + for (i=ED_RADIOBUTTON_ID_EDITOR_FIRST; i<= ED_RADIOBUTTON_ID_EDITOR_LAST; i++) + MapRadiobuttonGadget(i); + + /* draw drawing area */ + MapDrawingArea(ED_DRAWING_ID_RANDOM_BACKGROUND); +} + +static void DrawLevelInfoWindow() +{ + stick_element_properties_window = FALSE; + + UnmapLevelEditorWindowGadgets(); + + SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); + ClearField(); + +#if 1 +#if 1 + DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Global Settings"); +#else + DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Level Settings"); + DrawTextSCentered(ED_SETTINGS2_YPOS, FONT_TITLE_1, "Editor Settings"); +#endif +#else + DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS, + "Level Settings", FONT_TITLE_1); + DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS, + "Editor Settings", FONT_TITLE_1); +#endif + + DrawLevelInfoTabulatorGadgets(); + + if (edit_mode_levelinfo == ED_MODE_LEVELINFO_LEVEL) + DrawLevelInfoLevel(); + else /* (edit_mode_levelinfo == ED_MODE_LEVELINFO_EDITOR) */ + DrawLevelInfoEditor(); +} + +static void DrawCustomContentArea() +{ + int id = ED_DRAWING_ID_CUSTOM_CONTENT; + struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id]; + int x1 = right_gadget_border[GADGET_ID_CUSTOM_DEADLINESS]; + int x2 = right_gadget_border[GADGET_ID_CUSTOM_EXPLOSION_TYPE]; + int x3 = right_gadget_border[GADGET_ID_CUSTOM_EXPLODE_IMPACT]; + int xoffset = ED_DRAWINGAREA_TEXT_DISTANCE; + + /* add distance for potential left text (without drawing area border) */ + x2 += getTextWidthForGadget(drawingarea_info[id].text_left); + ModifyGadget(gi, GDI_X, MAX(x1, MAX(x2, x3)) + xoffset, GDI_END); MapDrawingArea(ED_DRAWING_ID_CUSTOM_CONTENT); @@ -7514,6 +7867,35 @@ static void DrawGroupElementArea(int element) MapDrawingArea(id); } +static void DrawPlayerInitialInventoryArea(int element) +{ + int player_nr = GET_PLAYER_NR(element); + int num_elements = level.initial_inventory_size[player_nr]; + int id = ED_DRAWING_ID_INVENTORY_CONTENT; + int sx = SX + drawingarea_info[id].x - MINI_TILEX / 2; + int sy = SY + drawingarea_info[id].y - MINI_TILEY / 2; + int xsize = MAX_INITIAL_INVENTORY_SIZE; + int ysize = 1; + + /* determine horizontal position to the right of specified gadget */ + if (drawingarea_info[id].gadget_id_align != GADGET_ID_NONE) + sx += (right_gadget_border[drawingarea_info[id].gadget_id_align] + + ED_DRAWINGAREA_TEXT_DISTANCE); + + /* determine horizontal offset for leading text */ + if (drawingarea_info[id].text_left != NULL) + sx += getTextWidthForDrawingArea(drawingarea_info[id].text_left); + + UnmapDrawingArea(id); + + ModifyEditorDrawingArea(id, num_elements, 1); + + /* delete content areas in case of reducing number of them */ + DrawBackground(sx, sy, (xsize + 1) * MINI_TILEX, (ysize + 1) * MINI_TILEY); + + MapDrawingArea(id); +} + static void DrawEnvelopeTextArea(int envelope_nr) { int id = ED_TEXTAREA_ID_ENVELOPE_INFO; @@ -7562,65 +7944,8 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line) int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width; int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; - return DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line, - max_lines_per_screen, TRUE); -} - -static void DrawPropertiesTabulatorGadgets() -{ - struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO]; - struct GadgetInfo *gd_gi4 = level_editor_gadget[GADGET_ID_PROPERTIES_CHANGE]; - struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED]; - int gd_x = gd->x + gd_gi1->border.width / 2; - int gd_y = gd->y + gd_gi1->height - 1; - Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y); - int id_first = ED_TEXTBUTTON_ID_PROPERTIES_INFO; - int id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG; -#if 1 -#else - int max_tabs = 4; -#endif - int i; - - /* draw additional "change" tabulator for custom elements */ - if (IS_CUSTOM_ELEMENT(properties_element)) - id_last = ED_TEXTBUTTON_ID_PROPERTIES_CHANGE; - - for (i = id_first; i <= id_last; i++) - { - int gadget_id = textbutton_info[i].gadget_id; - struct GadgetInfo *gi = level_editor_gadget[gadget_id]; - boolean active = (i != edit_mode_properties); - - /* use "config 1" and "config 2" instead of "config" */ - if (i == ED_TEXTBUTTON_ID_PROPERTIES_CONFIG && - IS_CUSTOM_ELEMENT(properties_element)) - continue; - - /* draw background line below tabulator button */ - ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1); - - /* draw solid line below inactive tabulator buttons */ - if (!active && tab_color != BLACK_PIXEL) /* black => transparent */ - FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width, 1, tab_color); - - ModifyGadget(gi, GDI_ACTIVE, active, GDI_END); - MapTextbuttonGadget(i); - } - -#if 1 - /* draw little border line below tabulator buttons */ - if (tab_color != BLACK_PIXEL) /* black => transparent */ - FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, - gd_gi4->x - gd_gi1->x + gd_gi4->width, ED_GADGET_DISTANCE, - tab_color); -#else - /* draw little border line below tabulator buttons */ - if (tab_color != BLACK_PIXEL) /* black => transparent */ - FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1, - max_tabs * gd_gi1->width + (max_tabs -1) * ED_GADGET_DISTANCE, - ED_GADGET_DISTANCE, tab_color); -#endif + return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1, + max_lines_per_screen, -1, TRUE, FALSE, FALSE); } static void DrawPropertiesInfo() @@ -7662,6 +7987,7 @@ static void DrawPropertiesInfo() { EP_DONT_RUN_INTO, "- deadly when running into" }, { EP_DONT_COLLIDE_WITH, "- deadly when colliding with" }, + { EP_DONT_GET_HIT_BY, "- deadly when getting hit by" }, { EP_DONT_TOUCH, "- deadly when touching" }, { EP_INDESTRUCTIBLE, "- indestructible" }, @@ -7835,6 +8161,7 @@ static struct { EL_EMC_KEY_6, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_EMC_KEY_7, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_EMC_KEY_8, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_DC_KEY_WHITE, &level.score[SC_KEY], TEXT_COLLECTING }, { EL_AMOEBA_WET, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, { EL_AMOEBA_DRY, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, { EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, @@ -7979,48 +8306,75 @@ static void DrawPropertiesConfig() /* these properties can be set for every player individually */ - drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value = - &level.start_element[player_nr]; - drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value = - &level.artwork_element[player_nr]; - drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value = - &level.explosion_element[player_nr]; - - checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value = - &level.use_start_element[player_nr]; - checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value = - &level.use_artwork_element[player_nr]; - checkbutton_info[ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT].value = - &level.use_explosion_element[player_nr]; - checkbutton_info[ED_CHECKBUTTON_ID_INITIAL_GRAVITY].value = - &level.initial_player_gravity[player_nr]; - - selectbox_info[ED_SELECTBOX_ID_PLAYER_SPEED].value = - &level.initial_player_stepsize[player_nr]; - - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID); - MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ? - ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD : - ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_GRAVITY); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE); - - MapDrawingArea(ED_DRAWING_ID_START_ELEMENT); - MapDrawingArea(ED_DRAWING_ID_ARTWORK_ELEMENT); - MapDrawingArea(ED_DRAWING_ID_EXPLOSION_ELEMENT); - - MapSelectboxGadget(ED_SELECTBOX_ID_PLAYER_SPEED); + if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_1) + { + drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value = + &level.start_element[player_nr]; + drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value = + &level.artwork_element[player_nr]; + drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value = + &level.explosion_element[player_nr]; + + checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value = + &level.use_start_element[player_nr]; + checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value = + &level.use_artwork_element[player_nr]; + checkbutton_info[ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT].value = + &level.use_explosion_element[player_nr]; + checkbutton_info[ED_CHECKBUTTON_ID_INITIAL_GRAVITY].value = + &level.initial_player_gravity[player_nr]; + + selectbox_info[ED_SELECTBOX_ID_PLAYER_SPEED].value = + &level.initial_player_stepsize[player_nr]; + + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID); + MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ? + ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD : + ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_SHIFTED_RELOCATION); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_GRAVITY); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE); + + MapDrawingArea(ED_DRAWING_ID_START_ELEMENT); + MapDrawingArea(ED_DRAWING_ID_ARTWORK_ELEMENT); + MapDrawingArea(ED_DRAWING_ID_EXPLOSION_ELEMENT); + + MapSelectboxGadget(ED_SELECTBOX_ID_PLAYER_SPEED); + } + else if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2) + { + drawingarea_info[ED_DRAWING_ID_INVENTORY_CONTENT].value = + &level.initial_inventory_content[player_nr][0]; + + counterbutton_info[ED_COUNTER_ID_INVENTORY_SIZE].value = + &level.initial_inventory_size[player_nr]; + + checkbutton_info[ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY].value = + &level.use_initial_inventory[player_nr]; + + /* draw checkbutton gadgets */ + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY); + + /* draw counter gadgets */ + MapCounterButtons(ED_COUNTER_ID_INVENTORY_SIZE); + + /* draw drawing area gadgets */ + DrawPlayerInitialInventoryArea(properties_element); + } } if (IS_GEM(properties_element)) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS); + if (properties_element == EL_EM_DYNAMITE) + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE); + if (COULD_MOVE_INTO_ACID(properties_element) && !ELEM_IS_PLAYER(properties_element) && (!IS_CUSTOM_ELEMENT(properties_element) || @@ -8167,6 +8521,7 @@ static void DrawPropertiesChangeDrawingAreas() { MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET); MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_ACTION); DrawCustomChangeContentArea(); } @@ -8178,171 +8533,1163 @@ static void DrawPropertiesChange() { int i; - /* needed to initially set selectbox options for special action options */ - setSelectboxSpecialActionOptions(); + /* needed to initially set selectbox options for special action options */ + setSelectboxSpecialActionOptions(); + + /* draw stickybutton gadget */ + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); + + /* draw checkbutton gadgets */ + for (i = ED_CHECKBUTTON_ID_CHANGE_FIRST; + i <= ED_CHECKBUTTON_ID_CHANGE_LAST; i++) + MapCheckbuttonGadget(i); + + /* draw counter gadgets */ + for (i = ED_COUNTER_ID_CHANGE_FIRST; + i <= ED_COUNTER_ID_CHANGE_LAST; i++) + MapCounterButtons(i); + + /* draw selectbox gadgets */ + for (i = ED_SELECTBOX_ID_CHANGE_FIRST; + i <= ED_SELECTBOX_ID_CHANGE_LAST; i++) + MapSelectboxGadget(i); + + /* draw textbutton gadgets */ + for (i = ED_TEXTBUTTON_ID_CHANGE_FIRST; + i <= ED_TEXTBUTTON_ID_CHANGE_LAST; i++) + MapTextbuttonGadget(i); + + /* draw graphicbutton gadgets */ + for (i = ED_GRAPHICBUTTON_ID_CHANGE_FIRST; + i <= ED_GRAPHICBUTTON_ID_CHANGE_LAST; i++) + MapGraphicbuttonGadget(i); + + /* draw drawing area gadgets */ + DrawPropertiesChangeDrawingAreas(); +} + +static void DrawEditorElementAnimation(int x, int y) +{ + int graphic = el2img(properties_element); + int frame = (ANIM_MODE(graphic) == ANIM_CE_VALUE ? + custom_element.ce_value_fixed_initial : + ANIM_MODE(graphic) == ANIM_CE_SCORE ? + custom_element.collect_score_initial : FrameCounter); + + DrawGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING); +} + +static void DrawEditorElementName(int x, int y, int element) +{ + char *element_name = getElementInfoText(element); + int font_nr = FONT_TEXT_1; + int font_width = getFontWidth(font_nr); + int font_height = getFontHeight(font_nr); + int max_text_width = SXSIZE - x - ED_ELEMENT_SETTINGS_XPOS(0); + int max_chars_per_line = max_text_width / font_width; + char buffer[max_chars_per_line + 1]; + + if (strlen(element_name) <= max_chars_per_line) + DrawTextS(x, y, font_nr, element_name); + else + { + int next_pos = max_chars_per_line; + + strncpy(buffer, element_name, max_chars_per_line); + buffer[max_chars_per_line] = '\0'; + + if (element_name[max_chars_per_line] == ' ') + next_pos++; + else + { + int i; + + for (i = max_chars_per_line - 1; i >= 0; i--) + if (buffer[i] == ' ') + break; + + if (strlen(&element_name[i + 1]) <= max_chars_per_line) + { + buffer[i] = '\0'; + next_pos = i + 1; + } + } + + DrawTextS(x, y - font_height / 2, font_nr, buffer); + + strncpy(buffer, &element_name[next_pos], max_chars_per_line); + buffer[max_chars_per_line] = '\0'; + + DrawTextS(x, y + font_height / 2, font_nr, buffer); + } +} + +static void DrawPropertiesWindow() +{ + int xstart = 2; + int ystart = 4; + + stick_element_properties_window = FALSE; + + /* make sure that previous properties edit mode exists for this element */ + if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG_2 && + !IS_CUSTOM_ELEMENT(properties_element)) + edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_2; + + if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG && + !ELEM_IS_PLAYER(properties_element) && + !IS_CUSTOM_ELEMENT(properties_element)) + edit_mode_properties = ED_MODE_PROPERTIES_CONFIG; + + if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG && + (ELEM_IS_PLAYER(properties_element) || + IS_CUSTOM_ELEMENT(properties_element))) + edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_1; + + CopyElementPropertiesToEditor(properties_element); + + UnmapLevelEditorWindowGadgets(); + UnmapLevelEditorToolboxDrawingGadgets(); + UnmapLevelEditorToolboxCustomGadgets(); + + if (IS_CUSTOM_ELEMENT(properties_element) || + IS_GROUP_ELEMENT(properties_element)) + MapLevelEditorToolboxCustomGadgets(); + + SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); + ClearField(); + +#if 1 + DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings"); +#else + DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS, + "Element Settings", FONT_TITLE_1); +#endif + + FrameCounter = 0; /* restart animation frame counter */ + + DrawElementBorder(SX + xstart * MINI_TILEX, + SY + ystart * MINI_TILEY + MINI_TILEY / 2, + TILEX, TILEY, FALSE); + + DrawEditorElementAnimation(SX + xstart * MINI_TILEX, + SY + ystart * MINI_TILEY + MINI_TILEY / 2); + + DrawEditorElementName((xstart + 3) * MINI_TILEX + 1, + (ystart + 1) * MINI_TILEY + 1, + properties_element); + + DrawPropertiesTabulatorGadgets(); + + if (edit_mode_properties == ED_MODE_PROPERTIES_INFO) + DrawPropertiesInfo(); + else if (edit_mode_properties == ED_MODE_PROPERTIES_CHANGE) + DrawPropertiesChange(); + else /* (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG[_1|_2]) */ + DrawPropertiesConfig(); +} + +static void UpdateCustomElementGraphicGadgets() +{ + struct ElementInfo *ei = &element_info[properties_element]; + int i; + + ei->gfx_element = (ei->use_gfx_element ? ei->gfx_element_initial : + properties_element); + + ModifyEditorElementList(); + RedrawDrawingElements(); + + /* force redraw of all mapped drawing area gadgets */ + for (i = 0; i < ED_NUM_DRAWING_AREAS; i++) + { + struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[i].gadget_id]; + + if (gi->mapped) + MapDrawingArea(i); + } +} + +static int getOpenDirectionFromTube(int element) +{ + switch (element) + { + case EL_TUBE_LEFT_UP: return (MV_LEFT | MV_UP); + case EL_TUBE_LEFT_DOWN: return (MV_LEFT | MV_DOWN); + case EL_TUBE_RIGHT_UP: return (MV_RIGHT | MV_UP); + case EL_TUBE_RIGHT_DOWN: return (MV_RIGHT | MV_DOWN); + case EL_TUBE_HORIZONTAL: return (MV_HORIZONTAL); + case EL_TUBE_HORIZONTAL_UP: return (MV_HORIZONTAL | MV_UP); + case EL_TUBE_HORIZONTAL_DOWN: return (MV_HORIZONTAL | MV_DOWN); + case EL_TUBE_VERTICAL: return (MV_VERTICAL); + case EL_TUBE_VERTICAL_LEFT: return (MV_VERTICAL | MV_LEFT); + case EL_TUBE_VERTICAL_RIGHT: return (MV_VERTICAL | MV_RIGHT); + case EL_TUBE_ANY: return (MV_ANY_DIRECTION); + } + + return MV_NONE; +} + +static int getTubeFromOpenDirection(int direction) +{ + switch (direction) + { + case (MV_LEFT | MV_UP): return EL_TUBE_LEFT_UP; + case (MV_LEFT | MV_DOWN): return EL_TUBE_LEFT_DOWN; + case (MV_RIGHT | MV_UP): return EL_TUBE_RIGHT_UP; + case (MV_RIGHT | MV_DOWN): return EL_TUBE_RIGHT_DOWN; + case (MV_HORIZONTAL): return EL_TUBE_HORIZONTAL; + case (MV_HORIZONTAL | MV_UP): return EL_TUBE_HORIZONTAL_UP; + case (MV_HORIZONTAL | MV_DOWN): return EL_TUBE_HORIZONTAL_DOWN; + case (MV_VERTICAL): return EL_TUBE_VERTICAL; + case (MV_VERTICAL | MV_LEFT): return EL_TUBE_VERTICAL_LEFT; + case (MV_VERTICAL | MV_RIGHT): return EL_TUBE_VERTICAL_RIGHT; + case (MV_ANY_DIRECTION): return EL_TUBE_ANY; + + /* if only one direction, fall back to simple tube with that direction */ + case (MV_LEFT): return EL_TUBE_HORIZONTAL; + case (MV_RIGHT): return EL_TUBE_HORIZONTAL; + case (MV_UP): return EL_TUBE_VERTICAL; + case (MV_DOWN): return EL_TUBE_VERTICAL; + } + + return EL_EMPTY; +} + +static int getTubeFromOpenDirectionNotEmpty(int direction, int element_old) +{ + int element_new = getTubeFromOpenDirection(direction); + + return (element_new != EL_EMPTY ? element_new : element_old); +} + +static int getOpenDirectionFromBelt(int element) +{ + int belt_dir = getBeltDirFromBeltElement(element); + + return (belt_dir == MV_LEFT ? MV_RIGHT : + belt_dir == MV_RIGHT ? MV_LEFT : + belt_dir == MV_NONE ? MV_HORIZONTAL : belt_dir); +} + +static int getBeltFromNrAndOpenDirection(int nr, int direction) +{ + int belt_dir = (direction == MV_LEFT ? MV_RIGHT : + direction == MV_RIGHT ? MV_LEFT : + direction == MV_HORIZONTAL ? MV_NONE : direction); + + if (direction == MV_NONE) + return EL_EMPTY; + + return getBeltElementFromBeltNrAndBeltDir(nr, belt_dir); +} + +static int getBeltFromNrAndOpenDirectionNotEmpty(int nr, int direction, + int element_old) +{ + int element_new = getBeltFromNrAndOpenDirection(nr, direction); + + return (element_new != EL_EMPTY ? element_new : element_old); +} + +static int getOpenDirectionFromPool(int element) +{ + switch (element) + { + case EL_ACID_POOL_TOPLEFT: return (MV_DOWN | MV_RIGHT); + case EL_ACID_POOL_TOPRIGHT: return (MV_DOWN | MV_LEFT); + case EL_ACID_POOL_BOTTOMLEFT: return (MV_UP | MV_RIGHT); + case EL_ACID_POOL_BOTTOMRIGHT: return (MV_UP | MV_LEFT); + case EL_ACID_POOL_BOTTOM: return (MV_HORIZONTAL | MV_UP); + case EL_ACID: return (MV_HORIZONTAL | MV_DOWN); + } + + return MV_NONE; +} + +static int getPoolFromOpenDirection(int direction) +{ + switch (direction) + { + case (MV_DOWN | MV_RIGHT): return EL_ACID_POOL_TOPLEFT; + case (MV_DOWN | MV_LEFT): return EL_ACID_POOL_TOPRIGHT; + case (MV_UP | MV_RIGHT): return EL_ACID_POOL_BOTTOMLEFT; + case (MV_UP | MV_LEFT): return EL_ACID_POOL_BOTTOMRIGHT; + case (MV_HORIZONTAL | MV_UP): return EL_ACID_POOL_BOTTOM; + case (MV_HORIZONTAL | MV_DOWN): return EL_ACID; + } + + return EL_EMPTY; +} + +static int getPoolFromOpenDirectionExt(int direction, int help_element) +{ + int element = getPoolFromOpenDirection(direction); + int help_direction = getOpenDirectionFromPool(help_element); + + if (element == EL_EMPTY) + { + int help_direction_vertical = help_direction & MV_VERTICAL; + + element = getPoolFromOpenDirection(direction | help_direction_vertical); + } + + if (element == EL_EMPTY) + { + int help_direction_horizontal = help_direction & MV_HORIZONTAL; + + element = getPoolFromOpenDirection(direction | help_direction_horizontal); + } + + return element; +} + +static int getPoolFromOpenDirectionNotEmpty(int direction, int element_old) +{ + int element_new = getPoolFromOpenDirectionExt(direction, element_old); + + return (element_new != EL_EMPTY ? element_new : element_old); +} + +static int getOpenDirectionFromPillar(int element) +{ + switch (element) + { + case EL_EMC_WALL_1: return (MV_DOWN); + case EL_EMC_WALL_2: return (MV_VERTICAL); + case EL_EMC_WALL_3: return (MV_UP); + } + + return MV_NONE; +} + +static int getPillarFromOpenDirection(int direction) +{ + switch (direction) + { + case (MV_DOWN): return EL_EMC_WALL_1; + case (MV_VERTICAL): return EL_EMC_WALL_2; + case (MV_UP): return EL_EMC_WALL_3; + } + + return EL_EMPTY; +} + +static int getPillarFromOpenDirectionNotEmpty(int direction, int element_old) +{ + int element_new = getPillarFromOpenDirection(direction); + + return (element_new != EL_EMPTY ? element_new : element_old); +} + +static int getOpenDirectionFromSteel2(int element) +{ + switch (element) + { + case EL_DC_STEELWALL_2_LEFT: return (MV_RIGHT); + case EL_DC_STEELWALL_2_RIGHT: return (MV_LEFT); + case EL_DC_STEELWALL_2_TOP: return (MV_DOWN); + case EL_DC_STEELWALL_2_BOTTOM: return (MV_UP); + case EL_DC_STEELWALL_2_HORIZONTAL: return (MV_HORIZONTAL); + case EL_DC_STEELWALL_2_VERTICAL: return (MV_VERTICAL); + case EL_DC_STEELWALL_2_MIDDLE: return (MV_ANY_DIRECTION); + case EL_DC_STEELWALL_2_SINGLE: return (MV_NONE); + } + + return MV_NONE; +} + +static int getSteel2FromOpenDirection(int direction) +{ + switch (direction) + { + case (MV_RIGHT): return EL_DC_STEELWALL_2_LEFT; + case (MV_LEFT): return EL_DC_STEELWALL_2_RIGHT; + case (MV_DOWN): return EL_DC_STEELWALL_2_TOP; + case (MV_UP): return EL_DC_STEELWALL_2_BOTTOM; + case (MV_HORIZONTAL): return EL_DC_STEELWALL_2_HORIZONTAL; + case (MV_VERTICAL): return EL_DC_STEELWALL_2_VERTICAL; + case (MV_ANY_DIRECTION): return EL_DC_STEELWALL_2_MIDDLE; + case (MV_NONE): return EL_DC_STEELWALL_2_SINGLE; + } + + return EL_EMPTY; +} + +static int getSteel2FromOpenDirectionNotEmpty(int direction, int element_old) +{ + int element_new = getSteel2FromOpenDirection(direction); + + return (element_new != EL_EMPTY ? element_new : element_old); +} + +static int getOpenDirectionFromChip(int element) +{ + switch (element) + { + case EL_SP_CHIP_SINGLE: return (MV_NONE); + case EL_SP_CHIP_LEFT: return (MV_RIGHT); + case EL_SP_CHIP_RIGHT: return (MV_LEFT); + case EL_SP_CHIP_TOP: return (MV_DOWN); + case EL_SP_CHIP_BOTTOM: return (MV_UP); + } + + return MV_NONE; +} + +static int getChipFromOpenDirection(int direction) +{ + switch (direction) + { + case (MV_NONE): return EL_SP_CHIP_SINGLE; + case (MV_LEFT): return EL_SP_CHIP_RIGHT; + case (MV_RIGHT): return EL_SP_CHIP_LEFT; + case (MV_UP): return EL_SP_CHIP_BOTTOM; + case (MV_DOWN): return EL_SP_CHIP_TOP; + } + + return EL_EMPTY; +} + +static int getChipFromOpenDirectionNotEmpty(int direction, int element_old) +{ + int element_new = getChipFromOpenDirection(direction); + + return (element_new != EL_EMPTY ? element_new : element_old); +} + +static int getClosedTube(int x, int y) +{ + static int xy[4][2] = + { + { -1, 0 }, + { +1, 0 }, + { 0, -1 }, + { 0, +1 } + }; + int element_old = IntelliDrawBuffer[x][y]; + int direction_old = getOpenDirectionFromTube(element_old); + int direction_new = MV_NONE; + int i; + + for (i = 0; i < NUM_DIRECTIONS; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + + if (IN_LEV_FIELD(xx, yy) && IS_TUBE(IntelliDrawBuffer[xx][yy]) && + (direction_old & dir) && + (getOpenDirectionFromTube(IntelliDrawBuffer[xx][yy]) & dir_opposite)) + direction_new |= dir; + } + + return getTubeFromOpenDirectionNotEmpty(direction_new, element_old); +} + +static int getClosedBelt(int x, int y) +{ + static int xy[4][2] = + { + { -1, 0 }, + { +1, 0 }, + { 0, -1 }, + { 0, +1 } + }; + int element_old = IntelliDrawBuffer[x][y]; + int nr = getBeltNrFromBeltElement(element_old); + int direction_old = getOpenDirectionFromBelt(element_old); + int direction_new = MV_NONE; + int i; + + for (i = MV_BIT_LEFT; i <= MV_BIT_RIGHT; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + + if (IN_LEV_FIELD(xx, yy) && IS_BELT(IntelliDrawBuffer[xx][yy]) && + (direction_old & dir) && + (getOpenDirectionFromBelt(IntelliDrawBuffer[xx][yy]) & dir_opposite)) + direction_new |= dir; + } + + return getBeltFromNrAndOpenDirection(nr, direction_new); +} + +static int getClosedPool(int x, int y) +{ + static int xy[4][2] = + { + { -1, 0 }, + { +1, 0 }, + { 0, -1 }, + { 0, +1 } + }; + int element_old = IntelliDrawBuffer[x][y]; + int direction_old = getOpenDirectionFromPool(element_old); + int direction_new = MV_NONE; + int i; + + for (i = 0; i < NUM_DIRECTIONS; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + + if (IN_LEV_FIELD(xx, yy) && + IS_ACID_POOL_OR_ACID(IntelliDrawBuffer[xx][yy]) && + (direction_old & dir) && + (getOpenDirectionFromPool(IntelliDrawBuffer[xx][yy]) & dir_opposite)) + direction_new |= dir; + } + + return getPoolFromOpenDirectionNotEmpty(direction_new, element_old); +} + +static int getClosedPillar(int x, int y) +{ + static int xy[4][2] = + { + { -1, 0 }, + { +1, 0 }, + { 0, -1 }, + { 0, +1 } + }; + int element_old = IntelliDrawBuffer[x][y]; + int direction_old = getOpenDirectionFromPillar(element_old); + int direction_new = MV_NONE; + int i; + + for (i = MV_BIT_UP; i <= MV_BIT_DOWN; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + + if (IN_LEV_FIELD(xx, yy) && IS_EMC_PILLAR(IntelliDrawBuffer[xx][yy]) && + (direction_old & dir) && + (getOpenDirectionFromPillar(IntelliDrawBuffer[xx][yy]) & dir_opposite)) + direction_new |= dir; + } + + return getPillarFromOpenDirectionNotEmpty(direction_new, element_old); +} + +static int getClosedSteel2(int x, int y) +{ + static int xy[4][2] = + { + { -1, 0 }, + { +1, 0 }, + { 0, -1 }, + { 0, +1 } + }; + int element_old = IntelliDrawBuffer[x][y]; + int direction_old = getOpenDirectionFromSteel2(element_old); + int direction_new = MV_NONE; + int i; + + for (i = 0; i < NUM_DIRECTIONS; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + + if (IN_LEV_FIELD(xx, yy) && IS_DC_STEELWALL_2(IntelliDrawBuffer[xx][yy]) && + (direction_old & dir) && + (getOpenDirectionFromSteel2(IntelliDrawBuffer[xx][yy]) & dir_opposite)) + direction_new |= dir; + } + + return getSteel2FromOpenDirectionNotEmpty(direction_new, element_old); +} + +static int getClosedChip(int x, int y) +{ + static int xy[4][2] = + { + { -1, 0 }, + { +1, 0 }, + { 0, -1 }, + { 0, +1 } + }; + int element_old = IntelliDrawBuffer[x][y]; + int direction_old = getOpenDirectionFromChip(element_old); + int direction_new = MV_NONE; + int i; + + for (i = 0; i < NUM_DIRECTIONS; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + + if (IN_LEV_FIELD(xx, yy) && IS_SP_CHIP(IntelliDrawBuffer[xx][yy]) && + (direction_old & dir) && + (getOpenDirectionFromChip(IntelliDrawBuffer[xx][yy]) & dir_opposite)) + direction_new |= dir; + } + + return getChipFromOpenDirectionNotEmpty(direction_new, element_old); +} + +static void SetElementSimple(int x, int y, int element, boolean change_level) +{ + int sx = x - level_xpos; + int sy = y - level_ypos; + + IntelliDrawBuffer[x][y] = element; + + if (change_level) + Feld[x][y] = element; + + if (IN_ED_FIELD(sx, sy)) + DrawMiniElement(sx, sy, element); +} + +static void MergeAndCloseNeighbourElements(int x1, int y1, int *element1, + int x2, int y2, int *element2, + int (*close_function)(int, int), + boolean change_level) +{ + /* set neighbour elements to newly determined connections */ + SetElementSimple(x1, y1, *element1, change_level); + SetElementSimple(x2, y2, *element2, change_level); + + /* remove all open connections of neighbour elements */ + *element1 = close_function(x1, y1); + *element2 = close_function(x2, y2); + + /* set neighbour elements to new, minimized connections */ + SetElementSimple(x1, y1, *element1, change_level); + SetElementSimple(x2, y2, *element2, change_level); +} + +static void SetElementIntelliDraw(int x, int y, int new_element, + boolean change_level, int button) +{ + static int xy[4][2] = + { + { -1, 0 }, + { +1, 0 }, + { 0, -1 }, + { 0, +1 } + }; + static int last_x = -1; + static int last_y = -1; + int old_element = IntelliDrawBuffer[x][y]; + + if (new_element == EL_UNDEFINED) + { + last_x = -1; + last_y = -1; + + return; + } + + if (IS_TUBE(new_element)) + { + int last_element_new = EL_UNDEFINED; + int direction = MV_NONE; + int i; + + /* if old element is of same kind, keep all existing directions */ + if (IS_TUBE(old_element)) + direction |= getOpenDirectionFromTube(old_element); + + for (i = 0; i < NUM_DIRECTIONS; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + + if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) && + IS_TUBE(IntelliDrawBuffer[last_x][last_y])) + { + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + int last_element_old = IntelliDrawBuffer[last_x][last_y]; + int last_direction_old = getOpenDirectionFromTube(last_element_old); + int last_direction_new = last_direction_old | dir_opposite; + + last_element_new = getTubeFromOpenDirection(last_direction_new); + + direction |= dir; + } + } + + new_element = getTubeFromOpenDirectionNotEmpty(direction, new_element); + + if (last_element_new != EL_UNDEFINED) + MergeAndCloseNeighbourElements(x, y, &new_element, + last_x, last_y, &last_element_new, + getClosedTube, change_level); + } + else if (IS_BELT(new_element)) + { + int belt_nr = getBeltNrFromBeltElement(new_element); + int last_element_new = EL_UNDEFINED; + int direction = MV_NONE; + int i; + + /* if old element is of same kind, keep all existing directions */ + if (IS_BELT(old_element)) + direction |= getOpenDirectionFromBelt(old_element); + + for (i = MV_BIT_LEFT; i <= MV_BIT_RIGHT; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + + if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) && + IS_BELT(IntelliDrawBuffer[last_x][last_y])) + { + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + int last_element_old = IntelliDrawBuffer[last_x][last_y]; + int last_belt_nr = getBeltNrFromBeltElement(last_element_old); + int last_direction_old = getOpenDirectionFromBelt(last_element_old); + int last_direction_new = last_direction_old | dir_opposite; + + last_element_new = getBeltFromNrAndOpenDirection(last_belt_nr, + last_direction_new); + direction |= dir; + } + } + + new_element = getBeltFromNrAndOpenDirectionNotEmpty(belt_nr, direction, + new_element); + if (last_element_new != EL_UNDEFINED) + MergeAndCloseNeighbourElements(x, y, &new_element, + last_x, last_y, &last_element_new, + getClosedBelt, change_level); + } + else if (IS_ACID_POOL_OR_ACID(new_element)) + { + int last_element_new = EL_UNDEFINED; + int direction = MV_NONE; + int i; + + /* if old element is of same kind, keep all existing directions */ + if (IS_ACID_POOL_OR_ACID(old_element)) + direction |= getOpenDirectionFromPool(old_element); + + for (i = 0; i < NUM_DIRECTIONS; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + + if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) && + IS_ACID_POOL_OR_ACID(IntelliDrawBuffer[last_x][last_y])) + { + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + int last_element_old = IntelliDrawBuffer[last_x][last_y]; + int last_direction_old = getOpenDirectionFromPool(last_element_old); + int last_direction_new = last_direction_old | dir_opposite; + + last_element_new = getPoolFromOpenDirection(last_direction_new); + + direction |= dir; + } + } + + /* special corrections needed for intuitively correct acid pool drawing */ + if (last_element_new == EL_EMPTY) + last_element_new = new_element; + else if (last_element_new != EL_UNDEFINED) + new_element = last_element_new; + + new_element = getPoolFromOpenDirectionNotEmpty(direction, new_element); + + if (last_element_new != EL_UNDEFINED) + MergeAndCloseNeighbourElements(x, y, &new_element, + last_x, last_y, &last_element_new, + getClosedPool, change_level); + } + else if (IS_EMC_PILLAR(new_element)) + { + int last_element_new = EL_UNDEFINED; + int direction = MV_NONE; + int i; + + /* if old element is of same kind, keep all existing directions */ + if (IS_EMC_PILLAR(old_element)) + direction |= getOpenDirectionFromPillar(old_element); + + for (i = MV_BIT_UP; i <= MV_BIT_DOWN; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + + if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) && + IS_EMC_PILLAR(IntelliDrawBuffer[last_x][last_y])) + { + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + int last_element_old = IntelliDrawBuffer[last_x][last_y]; + int last_direction_old = getOpenDirectionFromPillar(last_element_old); + int last_direction_new = last_direction_old | dir_opposite; + + last_element_new = getPillarFromOpenDirection(last_direction_new); + + direction |= dir; + } + } + + new_element = getPillarFromOpenDirectionNotEmpty(direction, new_element); + + if (last_element_new != EL_UNDEFINED) + MergeAndCloseNeighbourElements(x, y, &new_element, + last_x, last_y, &last_element_new, + getClosedPillar, change_level); + } + else if (IS_DC_STEELWALL_2(new_element)) + { + int last_element_new = EL_UNDEFINED; + int direction = MV_NONE; + int i; + + /* if old element is of same kind, keep all existing directions */ + if (IS_DC_STEELWALL_2(old_element)) + direction |= getOpenDirectionFromSteel2(old_element); + + for (i = 0; i < NUM_DIRECTIONS; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + + if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) && + IS_DC_STEELWALL_2(IntelliDrawBuffer[last_x][last_y])) + { + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + int last_element_old = IntelliDrawBuffer[last_x][last_y]; + int last_direction_old = getOpenDirectionFromSteel2(last_element_old); + int last_direction_new = last_direction_old | dir_opposite; + + last_element_new = getSteel2FromOpenDirection(last_direction_new); + + direction |= dir; + } + } + + new_element = getSteel2FromOpenDirectionNotEmpty(direction, new_element); + + if (last_element_new != EL_UNDEFINED) + MergeAndCloseNeighbourElements(x, y, &new_element, + last_x, last_y, &last_element_new, + getClosedSteel2, change_level); + } + else if (IS_SP_CHIP(new_element)) + { + int last_element_new = EL_UNDEFINED; + int direction = MV_NONE; + int i; + + /* (do not keep existing directions, regardless of kind of old element) */ - /* draw stickybutton gadget */ - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); + for (i = 0; i < NUM_DIRECTIONS; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; - /* draw checkbutton gadgets */ - for (i = ED_CHECKBUTTON_ID_CHANGE_FIRST; - i <= ED_CHECKBUTTON_ID_CHANGE_LAST; i++) - MapCheckbuttonGadget(i); + if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) && + IS_SP_CHIP(IntelliDrawBuffer[last_x][last_y])) + { + int dir = MV_DIR_FROM_BIT(i); + int dir_opposite = MV_DIR_OPPOSITE(dir); + int last_element_old = IntelliDrawBuffer[last_x][last_y]; + int last_direction_old = getOpenDirectionFromChip(last_element_old); + int last_direction_new = last_direction_old | dir_opposite; - /* draw counter gadgets */ - for (i = ED_COUNTER_ID_CHANGE_FIRST; - i <= ED_COUNTER_ID_CHANGE_LAST; i++) - MapCounterButtons(i); + if (last_direction_old == MV_NONE) + { + last_element_new = getChipFromOpenDirection(last_direction_new); + direction |= dir; + } + else if (last_direction_old & (dir | dir_opposite)) + { + direction |= MV_DIR_OPPOSITE(last_direction_old); + } + else + { + direction |= MV_DIR_OPPOSITE(dir); + } + } + } - /* draw selectbox gadgets */ - for (i = ED_SELECTBOX_ID_CHANGE_FIRST; - i <= ED_SELECTBOX_ID_CHANGE_LAST; i++) - MapSelectboxGadget(i); + new_element = getChipFromOpenDirectionNotEmpty(direction, new_element); - /* draw textbutton gadgets */ - for (i = ED_TEXTBUTTON_ID_CHANGE_FIRST; - i <= ED_TEXTBUTTON_ID_CHANGE_LAST; i++) - MapTextbuttonGadget(i); + if (last_element_new != EL_UNDEFINED) + MergeAndCloseNeighbourElements(x, y, &new_element, + last_x, last_y, &last_element_new, + getClosedChip, change_level); + } + else if (IS_SP_HARDWARE_BASE(new_element)) + { + int nr = GetSimpleRandom(6); - /* draw graphicbutton gadgets */ - for (i = ED_GRAPHICBUTTON_ID_CHANGE_FIRST; - i <= ED_GRAPHICBUTTON_ID_CHANGE_LAST; i++) - MapGraphicbuttonGadget(i); + new_element = (nr == 0 ? EL_SP_HARDWARE_BASE_1 : + nr == 1 ? EL_SP_HARDWARE_BASE_2 : + nr == 2 ? EL_SP_HARDWARE_BASE_3 : + nr == 3 ? EL_SP_HARDWARE_BASE_4 : + nr == 4 ? EL_SP_HARDWARE_BASE_5 : EL_SP_HARDWARE_BASE_6); + } + else if (new_element == EL_SP_HARDWARE_GREEN || + new_element == EL_SP_HARDWARE_BLUE || + new_element == EL_SP_HARDWARE_RED) + { + int nr = GetSimpleRandom(3); - /* draw drawing area gadgets */ - DrawPropertiesChangeDrawingAreas(); -} + new_element = (nr == 0 ? EL_SP_HARDWARE_GREEN : + nr == 1 ? EL_SP_HARDWARE_BLUE : EL_SP_HARDWARE_RED); + } + else if (IS_GROUP_ELEMENT(new_element)) + { + boolean connected_drawing = FALSE; + int i; -static void DrawEditorElementAnimation(int x, int y) -{ - int graphic = el2img(properties_element); - int frame = (ANIM_MODE(graphic) == ANIM_CE_VALUE ? - custom_element.ce_value_fixed_initial : - ANIM_MODE(graphic) == ANIM_CE_SCORE ? - custom_element.collect_score_initial : FrameCounter); + for (i = 0; i < NUM_DIRECTIONS; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; - DrawGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING); -} + if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) && + IS_IN_GROUP_EL(IntelliDrawBuffer[last_x][last_y], new_element)) + connected_drawing = TRUE; + } -static void DrawEditorElementName(int x, int y, int element) -{ - char *element_name = getElementInfoText(element); - int font_nr = FONT_TEXT_1; - int font_width = getFontWidth(font_nr); - int font_height = getFontHeight(font_nr); - int max_text_width = SXSIZE - x - ED_ELEMENT_SETTINGS_XPOS(0); - int max_chars_per_line = max_text_width / font_width; - char buffer[max_chars_per_line + 1]; + if (!connected_drawing) + ResolveGroupElement(new_element); - if (strlen(element_name) <= max_chars_per_line) - DrawTextS(x, y, font_nr, element_name); - else + new_element = GetElementFromGroupElement(new_element); + } + else if (IS_BELT_SWITCH(old_element)) { - int next_pos = max_chars_per_line; + int belt_nr = getBeltNrFromBeltSwitchElement(old_element); + int belt_dir = getBeltDirFromBeltSwitchElement(old_element); - strncpy(buffer, element_name, max_chars_per_line); - buffer[max_chars_per_line] = '\0'; + belt_dir = (belt_dir == MV_LEFT ? MV_NONE : + belt_dir == MV_NONE ? MV_RIGHT : MV_LEFT); - if (element_name[max_chars_per_line] == ' ') - next_pos++; - else + new_element = getBeltSwitchElementFromBeltNrAndBeltDir(belt_nr, belt_dir); + } + else + { + static int swappable_elements[][2] = { - int i; + { EL_EXIT_CLOSED, EL_EXIT_OPEN }, + { EL_DYNAMITE, EL_DYNAMITE_ACTIVE }, + { EL_EM_DYNAMITE, EL_EM_DYNAMITE_ACTIVE }, + { EL_QUICKSAND_EMPTY, EL_QUICKSAND_FULL }, + { EL_EMERALD, EL_WALL_EMERALD }, + { EL_EMERALD_YELLOW, EL_WALL_EMERALD_YELLOW }, + { EL_EMERALD_RED, EL_WALL_EMERALD_RED }, + { EL_EMERALD_PURPLE, EL_WALL_EMERALD_PURPLE }, + { EL_DIAMOND, EL_WALL_DIAMOND }, + { EL_BD_DIAMOND, EL_WALL_BD_DIAMOND }, + { EL_GATE_1, EL_GATE_1_GRAY }, + { EL_GATE_2, EL_GATE_2_GRAY }, + { EL_GATE_3, EL_GATE_3_GRAY }, + { EL_GATE_4, EL_GATE_4_GRAY }, + { EL_EM_GATE_1, EL_EM_GATE_1_GRAY }, + { EL_EM_GATE_2, EL_EM_GATE_2_GRAY }, + { EL_EM_GATE_3, EL_EM_GATE_3_GRAY }, + { EL_EM_GATE_4, EL_EM_GATE_4_GRAY }, + { EL_EMC_GATE_5, EL_EMC_GATE_5_GRAY }, + { EL_EMC_GATE_6, EL_EMC_GATE_6_GRAY }, + { EL_EMC_GATE_7, EL_EMC_GATE_7_GRAY }, + { EL_EMC_GATE_8, EL_EMC_GATE_8_GRAY }, + { EL_DC_GATE_WHITE, EL_DC_GATE_WHITE_GRAY }, + { EL_TIME_ORB_EMPTY, EL_TIME_ORB_FULL }, + { EL_LAMP, EL_LAMP_ACTIVE }, + { EL_SOKOBAN_FIELD_EMPTY, EL_SOKOBAN_FIELD_FULL }, + { EL_SP_BASE, EL_SP_BUGGY_BASE }, + { EL_PEARL, EL_WALL_PEARL }, + { EL_CRYSTAL, EL_WALL_CRYSTAL }, + { EL_TIMEGATE_CLOSED, EL_TIMEGATE_OPEN }, + { EL_SWITCHGATE_CLOSED, EL_SWITCHGATE_OPEN }, + { EL_SWITCHGATE_SWITCH_UP, EL_SWITCHGATE_SWITCH_DOWN }, + { EL_DC_SWITCHGATE_SWITCH_UP, EL_DC_SWITCHGATE_SWITCH_DOWN }, + { EL_LIGHT_SWITCH, EL_LIGHT_SWITCH_ACTIVE }, + { EL_LANDMINE, EL_DC_LANDMINE }, + { EL_SHIELD_NORMAL, EL_SHIELD_DEADLY }, + { EL_STEEL_EXIT_CLOSED, EL_STEEL_EXIT_OPEN }, + { EL_EM_EXIT_CLOSED, EL_EM_EXIT_OPEN }, + { EL_EM_STEEL_EXIT_CLOSED, EL_EM_STEEL_EXIT_OPEN }, + { EL_QUICKSAND_FAST_EMPTY, EL_QUICKSAND_FAST_FULL }, + + { -1, -1 }, + }; + static int rotatable_elements[][4] = + { + { + EL_BUG_UP, + EL_BUG_RIGHT, + EL_BUG_DOWN, + EL_BUG_LEFT + }, - for (i = max_chars_per_line - 1; i >= 0; i--) - if (buffer[i] == ' ') - break; + { + EL_SPACESHIP_UP, + EL_SPACESHIP_RIGHT, + EL_SPACESHIP_DOWN, + EL_SPACESHIP_LEFT + }, - if (strlen(&element_name[i + 1]) <= max_chars_per_line) { - buffer[i] = '\0'; - next_pos = i + 1; - } - } + EL_BD_BUTTERFLY_UP, + EL_BD_BUTTERFLY_RIGHT, + EL_BD_BUTTERFLY_DOWN, + EL_BD_BUTTERFLY_LEFT + }, - DrawTextS(x, y - font_height / 2, font_nr, buffer); + { + EL_BD_FIREFLY_UP, + EL_BD_FIREFLY_RIGHT, + EL_BD_FIREFLY_DOWN, + EL_BD_FIREFLY_LEFT + }, - strncpy(buffer, &element_name[next_pos], max_chars_per_line); - buffer[max_chars_per_line] = '\0'; + { + EL_PACMAN_UP, + EL_PACMAN_RIGHT, + EL_PACMAN_DOWN, + EL_PACMAN_LEFT + }, - DrawTextS(x, y + font_height / 2, font_nr, buffer); - } -} + { + EL_YAMYAM_UP, + EL_YAMYAM_RIGHT, + EL_YAMYAM_DOWN, + EL_YAMYAM_LEFT + }, -static void DrawPropertiesWindow() -{ - int xstart = 2; - int ystart = 4; + { + EL_ARROW_UP, + EL_ARROW_RIGHT, + EL_ARROW_DOWN, + EL_ARROW_LEFT + }, - stick_element_properties_window = FALSE; + { + EL_SP_PORT_UP, + EL_SP_PORT_RIGHT, + EL_SP_PORT_DOWN, + EL_SP_PORT_LEFT + }, - /* make sure that previous properties edit mode exists for this element */ - if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG && - !IS_CUSTOM_ELEMENT(properties_element)) - edit_mode_properties = ED_MODE_PROPERTIES_CONFIG; + { + EL_SP_GRAVITY_PORT_UP, + EL_SP_GRAVITY_PORT_RIGHT, + EL_SP_GRAVITY_PORT_DOWN, + EL_SP_GRAVITY_PORT_LEFT + }, - if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG && - IS_CUSTOM_ELEMENT(properties_element)) - edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_1; + { + EL_MOLE_UP, + EL_MOLE_RIGHT, + EL_MOLE_DOWN, + EL_MOLE_LEFT + }, - CopyElementPropertiesToEditor(properties_element); + { + EL_BALLOON_SWITCH_UP, + EL_BALLOON_SWITCH_RIGHT, + EL_BALLOON_SWITCH_DOWN, + EL_BALLOON_SWITCH_LEFT + }, - UnmapLevelEditorWindowGadgets(); - UnmapLevelEditorToolboxDrawingGadgets(); - UnmapLevelEditorToolboxCustomGadgets(); + { + EL_SP_GRAVITY_ON_PORT_UP, + EL_SP_GRAVITY_ON_PORT_RIGHT, + EL_SP_GRAVITY_ON_PORT_DOWN, + EL_SP_GRAVITY_ON_PORT_LEFT + }, - if (IS_CUSTOM_ELEMENT(properties_element) || - IS_GROUP_ELEMENT(properties_element)) - MapLevelEditorToolboxCustomGadgets(); + { + EL_SP_GRAVITY_OFF_PORT_UP, + EL_SP_GRAVITY_OFF_PORT_RIGHT, + EL_SP_GRAVITY_OFF_PORT_DOWN, + EL_SP_GRAVITY_OFF_PORT_LEFT + }, - SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); - ClearWindow(); + { + -1, + -1, + -1, + -1, + }, + }; + int i, j; + + for (i = 0; swappable_elements[i][0] != -1; i++) + { + int element1 = swappable_elements[i][0]; + int element2 = swappable_elements[i][1]; -#if 0 - DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings"); -#else - DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS, - "Element Settings", FONT_TITLE_1); -#endif + if (old_element == element1 || old_element == element2) + new_element = (old_element == element1 ? element2 : element1); + } - FrameCounter = 0; /* restart animation frame counter */ + for (i = 0; rotatable_elements[i][0] != -1; i++) + { + for (j = 0; j < 4; j++) + { + int element = rotatable_elements[i][j]; - DrawElementBorder(SX + xstart * MINI_TILEX, - SY + ystart * MINI_TILEY + MINI_TILEY / 2, - TILEX, TILEY, FALSE); + if (old_element == element) + new_element = (button == 1 ? rotatable_elements[i][(j + 3) % 4] : + button == 2 ? rotatable_elements[i][0] : + button == 3 ? rotatable_elements[i][(j + 1) % 4] : + old_element); + } + } + } - DrawEditorElementAnimation(SX + xstart * MINI_TILEX, - SY + ystart * MINI_TILEY + MINI_TILEY / 2); + SetElementSimple(x, y, new_element, change_level); - DrawEditorElementName((xstart + 3) * MINI_TILEX + 1, - (ystart + 1) * MINI_TILEY + 1, - properties_element); + last_x = x; + last_y = y; +} - DrawPropertiesTabulatorGadgets(); +static void ResetIntelliDraw() +{ + int x, y; - if (edit_mode_properties == ED_MODE_PROPERTIES_INFO) - DrawPropertiesInfo(); - else if (edit_mode_properties == ED_MODE_PROPERTIES_CHANGE) - DrawPropertiesChange(); - else /* (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG[_1|_2]) */ - DrawPropertiesConfig(); + for (x = 0; x < lev_fieldx; x++) + for (y = 0; y < lev_fieldy; y++) + IntelliDrawBuffer[x][y] = Feld[x][y]; + + SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE, -1); } -static void UpdateCustomElementGraphicGadgets() +static void SetElementExt(int x, int y, int element, boolean change_level, + int button) { - int i; - - ModifyEditorElementList(); - RedrawDrawingElements(); + if (element < 0) + SetElementSimple(x, y, Feld[x][y], change_level); + else if (GetKeyModState() & KMOD_Shift) + SetElementIntelliDraw(x, y, element, change_level, button); + else + SetElementSimple(x, y, element, change_level); +} - /* force redraw of all mapped drawing area gadgets */ - for (i = 0; i < ED_NUM_DRAWING_AREAS; i++) - { - struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[i].gadget_id]; +static void SetElement(int x, int y, int element) +{ + SetElementExt(x, y, element, TRUE, -1); +} - if (gi->mapped) - MapDrawingArea(i); - } +static void SetElementButton(int x, int y, int element, int button) +{ + SetElementExt(x, y, element, TRUE, button); } static void DrawLineElement(int sx, int sy, int element, boolean change_level) @@ -8350,66 +9697,51 @@ static void DrawLineElement(int sx, int sy, int element, boolean change_level) int lx = sx + level_xpos; int ly = sy + level_ypos; - DrawMiniElement(sx, sy, (element < 0 ? Feld[lx][ly] : element)); - - if (change_level) - Feld[lx][ly] = element; + SetElementExt(lx, ly, element, change_level, -1); } static void DrawLine(int from_x, int from_y, int to_x, int to_y, int element, boolean change_level) { + int xsize = ABS(to_x - from_x); + int ysize = ABS(to_y - from_y); + int dx = (to_x < from_x ? -1 : +1); + int dy = (to_y < from_y ? -1 : +1); + int i; + if (from_y == to_y) /* horizontal line */ { - int x; - int y = from_y; - - if (from_x > to_x) - swap_numbers(&from_x, &to_x); - - for (x = from_x; x <= to_x; x++) - DrawLineElement(x, y, element, change_level); + for (i = 0; i <= xsize; i++) + DrawLineElement(from_x + i * dx, from_y, element, change_level); } else if (from_x == to_x) /* vertical line */ { - int x = from_x; - int y; - - if (from_y > to_y) - swap_numbers(&from_y, &to_y); - - for (y = from_y; y <= to_y; y++) - DrawLineElement(x, y, element, change_level); + for (i = 0; i <= ysize; i++) + DrawLineElement(from_x, from_y + i * dy, element, change_level); } else /* diagonal line */ { - int len_x = ABS(to_x - from_x); - int len_y = ABS(to_y - from_y); - int x, y; - - if (len_y < len_x) /* a < 1 */ + if (ysize < xsize) /* a < 1 */ { - float a = (float)len_y / (float)len_x; - - if (from_x > to_x) - swap_number_pairs(&from_x, &from_y, &to_x, &to_y); + float a = (float)ysize / (float)xsize; - for (x = 0; x <= len_x; x++) + for (i = 0; i <= xsize; i++) { - y = (int)(a * x + 0.5) * (to_y < from_y ? -1 : +1); + int x = dx * i; + int y = dy * (int)(a * i + 0.5); + DrawLineElement(from_x + x, from_y + y, element, change_level); } } else /* a >= 1 */ { - float a = (float)len_x / (float)len_y; - - if (from_y > to_y) - swap_number_pairs(&from_x, &from_y, &to_x, &to_y); + float a = (float)xsize / (float)ysize; - for (y = 0; y <= len_y; y++) + for (i = 0; i <= ysize; i++) { - x = (int)(a * y + 0.5) * (to_x < from_x ? -1 : +1); + int x = dx * (int)(a * i + 0.5); + int y = dy * i; + DrawLineElement(from_x + x, from_y + y, element, change_level); } } @@ -8617,7 +9949,7 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, for (y = 0; y < brush_height; y++) { - for (x=0; x < brush_width; x++) + for (x = 0; x < brush_width; x++) { brush_buffer[x][y] = Feld[from_lx + x][from_ly + y]; @@ -8910,6 +10242,10 @@ static void RandomPlacement(int new_element) int num_percentage, num_elements; int x, y; +#if 1 + ResetIntelliDraw(); +#endif + /* determine number of free positions for randomly placing the new element */ for (x = 0; x < lev_fieldx; x++) for (y = 0; y < lev_fieldy; y++) { @@ -8933,20 +10269,28 @@ static void RandomPlacement(int new_element) for (x = 0; x < lev_fieldx; x++) for (y = 0; y < lev_fieldy; y++) if (free_position[x][y]) +#if 1 + SetElement(x, y, new_element); +#else Feld[x][y] = new_element; +#endif } else { while (num_elements > 0) { - x = RND(lev_fieldx); - y = RND(lev_fieldy); + x = GetSimpleRandom(lev_fieldx); + y = GetSimpleRandom(lev_fieldy); /* don't place element at the same position twice */ if (free_position[x][y]) { free_position[x][y] = FALSE; +#if 1 + SetElement(x, y, new_element); +#else Feld[x][y] = new_element; +#endif num_elements--; } } @@ -9047,6 +10391,12 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) actual_drawing_function = GADGET_ID_PICK_ELEMENT; } + if (GetKeyModState() & KMOD_Shift) + { + if (button_press_event || button_release_event) + ResetIntelliDraw(); + } + switch (actual_drawing_function) { case GADGET_ID_SINGLE_ITEMS: @@ -9059,17 +10409,27 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) if (edit_mode == ED_MODE_DRAWING && draw_with_brush && !inside_drawing_area) DeleteBrushFromCursor(); + +#if 0 + ResetIntelliDraw(); +#endif } - if (!button) + if (!button || button_release_event) break; if (draw_with_brush) { +#if 0 if (!button_release_event) +#endif CopyBrushToLevel(sx, sy, button); } +#if 1 + else +#else else if (new_element != Feld[lx][ly]) +#endif { if (new_element == EL_PLAYER_1) { @@ -9080,18 +10440,30 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) { if (Feld[x][y] == EL_PLAYER_1) { +#if 1 + SetElement(x, y, EL_EMPTY); +#else Feld[x][y] = EL_EMPTY; +#if 1 + if (IN_ED_FIELD(x - level_xpos, y - level_ypos)) + DrawMiniElement(x - level_xpos, y - level_ypos, EL_EMPTY); +#else if (x - level_xpos >= 0 && x - level_xpos < ed_fieldx && y - level_ypos >= 0 && y - level_ypos < ed_fieldy) - DrawMiniElement(x - level_xpos, y - level_ypos, - EL_EMPTY); + DrawMiniElement(x - level_xpos, y - level_ypos, EL_EMPTY); +#endif +#endif } } } } +#if 1 + SetElementButton(lx, ly, new_element, button); +#else Feld[lx][ly] = new_element; DrawMiniElement(sx, sy, new_element); +#endif } } else @@ -9272,7 +10644,10 @@ static void HandleCounterButtons(struct GadgetInfo *gi) if (counter_id == ED_COUNTER_ID_SELECT_LEVEL) { LoadLevel(level_nr); + LoadScore(level_nr); + TapeErase(); + ResetUndoBuffer(); DrawEditModeWindow(); @@ -9298,6 +10673,10 @@ static void HandleCounterButtons(struct GadgetInfo *gi) CopyGroupElementPropertiesToGame(properties_element); break; + case ED_COUNTER_ID_INVENTORY_SIZE: + DrawPlayerInitialInventoryArea(properties_element); + break; + case ED_COUNTER_ID_ENVELOPE_XSIZE: case ED_COUNTER_ID_ENVELOPE_YSIZE: DrawEnvelopeTextArea(-1); @@ -9394,8 +10773,15 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) int type_id = gi->custom_type_id; int i; - if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_FIRST && - type_id <= ED_TEXTBUTTON_ID_PROPERTIES_LAST) + if (type_id >= ED_TEXTBUTTON_ID_LEVELINFO_FIRST && + type_id <= ED_TEXTBUTTON_ID_LEVELINFO_LAST) + { + edit_mode_levelinfo = gi->custom_type_id; + + DrawLevelInfoWindow(); + } + else if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_FIRST && + type_id <= ED_TEXTBUTTON_ID_PROPERTIES_LAST) { edit_mode_properties = gi->custom_type_id; @@ -9406,12 +10792,21 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) char *template_filename = getDefaultLevelFilename(-1); boolean new_template = !fileExists(template_filename); + /* backup original "level.field" (needed to track playfield changes) */ + CopyPlayfield(level.field, FieldBackup); + + /* "SaveLevelTemplate()" uses "level.field", so copy editor playfield */ + CopyPlayfield(Feld, level.field); + if (new_template || Request("Save this template and kill the old ?", REQ_ASK)) SaveLevelTemplate(); if (new_template) Request("Template saved !", REQ_CONFIRM); + + /* restore original "level.field" (needed to track playfield changes) */ + CopyPlayfield(FieldBackup, level.field); } else if (type_id == ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE && custom_element.num_change_pages < MAX_CHANGE_PAGES) @@ -9861,16 +11256,18 @@ static void HandleControlButtons(struct GadgetInfo *gi) CloseDoor(DOOR_CLOSE_ALL); + BackToFront(); /* force redraw of undrawn special door */ + DrawCompleteVideoDisplay(); level_editor_test_game = TRUE; - StartGameActions(FALSE, setup.autorecord, NEW_RANDOMIZE); + StartGameActions(FALSE, setup.autorecord, level.random_seed); } break; case GADGET_ID_EXIT: - RequestExitLevelEditor(TRUE); /* if level has changed, ask user */ + RequestExitLevelEditor(TRUE, FALSE); /* if level has changed, ask user */ break; default: @@ -10049,7 +11446,7 @@ void HandleLevelEditorKeyInput(Key key) case KSYM_Escape: if (edit_mode == ED_MODE_DRAWING) { - RequestExitLevelEditor(setup.ask_on_escape_editor); + RequestExitLevelEditor(setup.ask_on_escape_editor, TRUE); } else if (edit_mode == ED_MODE_INFO) { @@ -10090,6 +11487,7 @@ void HandleLevelEditorIdle() static unsigned long action_delay = 0; unsigned long action_delay_value = GameFrameDelay; int xpos = 1, ypos = 2; + int i; if (edit_mode != ED_MODE_PROPERTIES) return; @@ -10097,6 +11495,14 @@ void HandleLevelEditorIdle() if (!DelayReached(&action_delay, action_delay_value)) return; + for (i = 0; i < ED_NUM_SELECTBOX; i++) + { + struct GadgetInfo *gi = level_editor_gadget[selectbox_info[i].gadget_id]; + + if (gi->mapped && gi->active && gi->selectbox.open) + return; + } + DrawEditorElementAnimation(SX + xpos * TILEX, SY + ypos * TILEY + MINI_TILEY / 2); @@ -10320,7 +11726,8 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, infotext); } -void RequestExitLevelEditor(boolean ask_if_level_has_changed) +void RequestExitLevelEditor(boolean ask_if_level_has_changed, + boolean quick_quit) { if (!ask_if_level_has_changed || !LevelChanged() || @@ -10329,8 +11736,21 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed) { CloseDoor(DOOR_CLOSE_1); SetDoorState(DOOR_CLOSE_2); + +#if 1 + if (quick_quit) + FadeSkipNextFadeIn(); +#else + if (quick_quit) + fading = fading_none; +#endif + game_status = GAME_MODE_MAIN; +#if 1 + DrawAndFadeInMainMenu(REDRAW_FIELD); +#else DrawMainMenu(); +#endif } else {