X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=d780a053e1453e4d44e34935756d610fd4d41822;hb=62ce600f34661138022d2ab3e67b254d43b5228e;hp=d4b4102a86ed28a7f9ab7b498065a9f49f4a980f;hpb=12a224578d49391c7c4c27ad898059ae17e9b880;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index d4b4102a..d780a053 100644 --- a/src/editor.c +++ b/src/editor.c @@ -20,6 +20,7 @@ #include "tools.h" #include "files.h" #include "game.h" +#include "init.h" #include "tape.h" @@ -122,9 +123,13 @@ #define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(12) + \ ED_GADGET_DISTANCE - MINI_TILEY) /* custom change trigger element */ -#define ED_AREA_ELEM_CONTENT5_XPOS (30 * MINI_TILEX + MINI_TILEX / 2) +#define ED_AREA_ELEM_CONTENT5_XPOS (28 * MINI_TILEX) #define ED_AREA_ELEM_CONTENT5_YPOS (ED_SETTINGS_YPOS(7) + \ ED_GADGET_DISTANCE) +/* extended custom change target */ +#define ED_AREA_ELEM_CONTENT6_XPOS (29 * MINI_TILEX) +#define ED_AREA_ELEM_CONTENT6_YPOS (ED_SETTINGS_YPOS(10) + \ + ED_GADGET_DISTANCE - MINI_TILEY) /* values for random placement background drawing area */ #define ED_AREA_RANDOM_BACKGROUND_XPOS (29 * MINI_TILEX) @@ -293,9 +298,9 @@ #define GADGET_ID_LEVEL_RANDOM_DOWN (GADGET_ID_COUNTER_FIRST + 9) #define GADGET_ID_LEVEL_RANDOM_TEXT (GADGET_ID_COUNTER_FIRST + 10) #define GADGET_ID_LEVEL_RANDOM_UP (GADGET_ID_COUNTER_FIRST + 11) -#define GADGET_ID_LEVEL_COLLECT_DOWN (GADGET_ID_COUNTER_FIRST + 12) -#define GADGET_ID_LEVEL_COLLECT_TEXT (GADGET_ID_COUNTER_FIRST + 13) -#define GADGET_ID_LEVEL_COLLECT_UP (GADGET_ID_COUNTER_FIRST + 14) +#define GADGET_ID_LEVEL_GEMSLIMIT_DOWN (GADGET_ID_COUNTER_FIRST + 12) +#define GADGET_ID_LEVEL_GEMSLIMIT_TEXT (GADGET_ID_COUNTER_FIRST + 13) +#define GADGET_ID_LEVEL_GEMSLIMIT_UP (GADGET_ID_COUNTER_FIRST + 14) #define GADGET_ID_LEVEL_TIMELIMIT_DOWN (GADGET_ID_COUNTER_FIRST + 15) #define GADGET_ID_LEVEL_TIMELIMIT_TEXT (GADGET_ID_COUNTER_FIRST + 16) #define GADGET_ID_LEVEL_TIMELIMIT_UP (GADGET_ID_COUNTER_FIRST + 17) @@ -308,12 +313,12 @@ #define GADGET_ID_ELEMENT_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 24) #define GADGET_ID_ELEMENT_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 25) #define GADGET_ID_ELEMENT_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 26) -#define GADGET_ID_COLLECT_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 27) -#define GADGET_ID_COLLECT_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 28) -#define GADGET_ID_COLLECT_SCORE_UP (GADGET_ID_COUNTER_FIRST + 29) -#define GADGET_ID_COLLECT_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 30) -#define GADGET_ID_COLLECT_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 31) -#define GADGET_ID_COLLECT_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 32) +#define GADGET_ID_CUSTOM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 27) +#define GADGET_ID_CUSTOM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 28) +#define GADGET_ID_CUSTOM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 29) +#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 30) +#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 31) +#define GADGET_ID_CUSTOM_GEMCOUNT_UP (GADGET_ID_COUNTER_FIRST + 32) #define GADGET_ID_PUSH_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 33) #define GADGET_ID_PUSH_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 34) #define GADGET_ID_PUSH_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 35) @@ -332,9 +337,12 @@ #define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 48) #define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 49) #define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 50) +#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 51) +#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 52) +#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 53) /* drawing area identifiers */ -#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 51) +#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 54) #define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0) #define GADGET_ID_ELEMENT_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1) @@ -349,17 +357,19 @@ #define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 10) #define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 11) #define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 12) -#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 13) -#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 14) +#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 13) +#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 14) +#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 15) /* text input identifiers */ -#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 15) +#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 16) #define GADGET_ID_LEVEL_NAME (GADGET_ID_TEXT_INPUT_FIRST + 0) #define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1) +#define GADGET_ID_ELEMENT_NAME (GADGET_ID_TEXT_INPUT_FIRST + 2) /* selectbox identifiers */ -#define GADGET_ID_SELECTBOX_FIRST (GADGET_ID_TEXT_INPUT_FIRST + 2) +#define GADGET_ID_SELECTBOX_FIRST (GADGET_ID_TEXT_INPUT_FIRST + 3) #define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 0) #define GADGET_ID_CUSTOM_CONSISTENCY (GADGET_ID_SELECTBOX_FIRST + 1) @@ -368,15 +378,17 @@ #define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 4) #define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 5) #define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 6) -#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 7) -#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 8) -#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 9) -#define GADGET_ID_CHANGE_PLAYER_ACTION (GADGET_ID_SELECTBOX_FIRST + 10) -#define GADGET_ID_CHANGE_IMPACT_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) -#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 7) +#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 8) +#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 9) +#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 10) +#define GADGET_ID_CHANGE_PLAYER_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) +#define GADGET_ID_CHANGE_COLLIDE_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 13) +#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 14) /* textbutton identifiers */ -#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 13) +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 15) #define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) #define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) @@ -424,13 +436,17 @@ #define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 18) #define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 19) #define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_CHANGE_BY_PLAYER (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_CHANGE_IMPACT_SMASHED (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_CHANGE_BY_OTHER (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 22) +#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 23) +#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_CHANGE_BY_PLAYER (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_CHANGE_BY_COLLISION (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_CHANGE_BY_OTHER (GADGET_ID_CHECKBUTTON_FIRST + 28) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 29) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -445,31 +461,32 @@ #define ED_COUNTER_ID_SELECT_LEVEL 0 #define ED_COUNTER_ID_LEVEL_XSIZE 1 #define ED_COUNTER_ID_LEVEL_YSIZE 2 -#define ED_COUNTER_ID_LEVEL_COLLECT 3 +#define ED_COUNTER_ID_LEVEL_GEMSLIMIT 3 #define ED_COUNTER_ID_LEVEL_TIMELIMIT 4 #define ED_COUNTER_ID_LEVEL_TIMESCORE 5 #define ED_COUNTER_ID_LEVEL_RANDOM 6 #define ED_COUNTER_ID_ELEMENT_SCORE 7 #define ED_COUNTER_ID_ELEMENT_CONTENT 8 -#define ED_COUNTER_ID_COLLECT_SCORE 9 -#define ED_COUNTER_ID_COLLECT_GEMCOUNT 10 +#define ED_COUNTER_ID_CUSTOM_SCORE 9 +#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 10 #define ED_COUNTER_ID_PUSH_DELAY_FIX 11 #define ED_COUNTER_ID_PUSH_DELAY_RND 12 #define ED_COUNTER_ID_MOVE_DELAY_FIX 13 #define ED_COUNTER_ID_MOVE_DELAY_RND 14 #define ED_COUNTER_ID_CHANGE_DELAY_FIX 15 #define ED_COUNTER_ID_CHANGE_DELAY_RND 16 +#define ED_COUNTER_ID_CHANGE_CONT_RND 17 -#define ED_NUM_COUNTERBUTTONS 17 +#define ED_NUM_COUNTERBUTTONS 18 #define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE #define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM -#define ED_COUNTER_ID_CUSTOM_FIRST ED_COUNTER_ID_COLLECT_SCORE +#define ED_COUNTER_ID_CUSTOM_FIRST ED_COUNTER_ID_CUSTOM_SCORE #define ED_COUNTER_ID_CUSTOM_LAST ED_COUNTER_ID_MOVE_DELAY_RND #define ED_COUNTER_ID_CHANGE_FIRST ED_COUNTER_ID_CHANGE_DELAY_FIX -#define ED_COUNTER_ID_CHANGE_LAST ED_COUNTER_ID_CHANGE_DELAY_RND +#define ED_COUNTER_ID_CHANGE_LAST ED_COUNTER_ID_CHANGE_CONT_RND /* values for scrollbutton gadgets */ #define ED_SCROLLBUTTON_ID_AREA_UP 0 @@ -497,34 +514,37 @@ /* values for text input gadgets */ #define ED_TEXTINPUT_ID_LEVEL_NAME 0 #define ED_TEXTINPUT_ID_LEVEL_AUTHOR 1 +#define ED_TEXTINPUT_ID_ELEMENT_NAME 2 -#define ED_NUM_TEXTINPUT 2 +#define ED_NUM_TEXTINPUT 3 #define ED_TEXTINPUT_ID_LEVEL_FIRST ED_TEXTINPUT_ID_LEVEL_NAME #define ED_TEXTINPUT_ID_LEVEL_LAST ED_TEXTINPUT_ID_LEVEL_AUTHOR /* values for selectbox gadgets */ -#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 0 -#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 1 -#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 2 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 0 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 1 +#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 2 #define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 3 #define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 4 #define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 5 #define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 6 -#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 7 -#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 8 -#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 9 -#define ED_SELECTBOX_ID_CHANGE_PLAYER_ACTION 10 -#define ED_SELECTBOX_ID_CHANGE_IMPACT_ACTION 11 -#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 12 +#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 7 +#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 8 +#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 9 +#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 10 +#define ED_SELECTBOX_ID_CHANGE_PLAYER_ACTION 11 +#define ED_SELECTBOX_ID_CHANGE_COLLIDE_ACTION 12 +#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 13 +#define ED_SELECTBOX_ID_CHANGE_POWER 14 -#define ED_NUM_SELECTBOX 13 +#define ED_NUM_SELECTBOX 15 -#define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION -#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER +#define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE +#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_CONSISTENCY #define ED_SELECTBOX_ID_CHANGE_FIRST ED_SELECTBOX_ID_CHANGE_TIME_UNITS -#define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_CHANGE_OTHER_ACTION +#define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_CHANGE_POWER /* values for textbutton gadgets */ #define ED_TEXTBUTTON_ID_PROPERTIES_INFO 0 @@ -540,35 +560,39 @@ #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 2 #define ED_CHECKBUTTON_ID_STICK_ELEMENT 3 #define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 4 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 5 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 6 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 7 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 8 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 9 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 10 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 11 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 12 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 13 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 14 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 15 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 5 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 6 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 7 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 8 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 9 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 10 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 11 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 12 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 13 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 14 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 15 #define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 16 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 17 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 18 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 19 -#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER 20 -#define ED_CHECKBUTTON_ID_CHANGE_IMPACT_SMASHED 21 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER 22 - -#define ED_NUM_CHECKBUTTONS 23 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 17 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 18 +#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER 19 +#define ED_CHECKBUTTON_ID_CHANGE_BY_COLLISION 20 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER 21 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 22 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 23 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 24 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 25 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 26 + +#define ED_NUM_CHECKBUTTONS 27 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED -#define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT -#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE +#define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE +#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC -#define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CHANGE_BY_OTHER +#define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE /* values for radiobutton gadgets */ #define ED_RADIOBUTTON_ID_PERCENTAGE 0 @@ -711,8 +735,8 @@ static struct { ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(3), 0, 999, - GADGET_ID_LEVEL_COLLECT_DOWN, GADGET_ID_LEVEL_COLLECT_UP, - GADGET_ID_LEVEL_COLLECT_TEXT, + GADGET_ID_LEVEL_GEMSLIMIT_DOWN, GADGET_ID_LEVEL_GEMSLIMIT_UP, + GADGET_ID_LEVEL_GEMSLIMIT_TEXT, &level.gems_needed, "number of emeralds to collect", NULL, NULL }, @@ -765,17 +789,17 @@ static struct { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3), MIN_SCORE, MAX_SCORE, - GADGET_ID_COLLECT_SCORE_DOWN, GADGET_ID_COLLECT_SCORE_UP, - GADGET_ID_COLLECT_SCORE_TEXT, - &custom_element.collect_score, + GADGET_ID_CUSTOM_SCORE_DOWN, GADGET_ID_CUSTOM_SCORE_UP, + GADGET_ID_CUSTOM_SCORE_TEXT, + &custom_element.score, NULL, "collect score", NULL }, { ED_SETTINGS_XPOS(13) + 10, ED_SETTINGS_YPOS(3), MIN_GEM_COUNT, MAX_GEM_COUNT, - GADGET_ID_COLLECT_GEMCOUNT_DOWN, GADGET_ID_COLLECT_GEMCOUNT_UP, - GADGET_ID_COLLECT_GEMCOUNT_TEXT, - &custom_element.collect_gem_count, + GADGET_ID_CUSTOM_GEMCOUNT_DOWN, GADGET_ID_CUSTOM_GEMCOUNT_UP, + GADGET_ID_CUSTOM_GEMCOUNT_TEXT, + &custom_element.gem_count, NULL, "gems", NULL }, { @@ -828,7 +852,15 @@ static struct GADGET_ID_CHANGE_DELAY_RND_TEXT, &custom_element.change.delay_random, NULL, "+random", NULL - } + }, + { + ED_SETTINGS_XPOS(3), ED_SETTINGS_YPOS(12), + 0, 100, + GADGET_ID_CHANGE_CONT_RND_DOWN, GADGET_ID_CHANGE_CONT_RND_UP, + GADGET_ID_CHANGE_CONT_RND_TEXT, + &custom_element.change.random, + NULL, "use random change:", NULL + }, }; static struct @@ -853,9 +885,31 @@ static struct MAX_LEVEL_AUTHOR_LEN, level.author, "Author" + }, + { + 5 * MINI_TILEX, 5 * MINI_TILEY - ED_BORDER_SIZE, + GADGET_ID_ELEMENT_NAME, + MAX_ELEMENT_NAME_LEN - 2, /* currently 2 chars less editable */ + custom_element.description, + NULL } }; +static struct ValueTextInfo options_access_type[] = +{ + { EP_WALKABLE, "walk" }, + { EP_PASSABLE, "pass" }, + { -1, NULL } +}; + +static struct ValueTextInfo options_access_layer[] = +{ + { EP_ACCESSIBLE_OVER, "over" }, + { EP_ACCESSIBLE_INSIDE, "inside" }, + { EP_ACCESSIBLE_UNDER, "under" }, + { -1, NULL } +}; + static struct ValueTextInfo options_walk_to_action[] = { { EP_DIGGABLE, "diggable" }, @@ -863,7 +917,6 @@ static struct ValueTextInfo options_walk_to_action[] = { EP_PUSHABLE, "pushable" }, { -1, NULL } }; -static int value_walk_to_action = 0; static struct ValueTextInfo options_move_pattern[] = { @@ -903,48 +956,40 @@ static struct ValueTextInfo options_move_stepsize[] = { -1, NULL } }; -static struct ValueTextInfo options_consistency[] = -{ - { EP_CAN_EXPLODE, "can explode" }, - { EP_INDESTRUCTIBLE, "indestructible" }, - { -1, NULL } -}; -static int value_consistency = 0; - -static struct ValueTextInfo options_deadliness[] = -{ - { EP_DONT_RUN_INTO, "running into" }, - { EP_DONT_COLLIDE_WITH, "colliding with" }, - { EP_DONT_TOUCH, "touching" }, - { -1, NULL } -}; -static int value_deadliness = 0; - static struct ValueTextInfo options_smash_targets[] = { { EP_CAN_SMASH_PLAYER, "player" }, +#if 0 { EP_CAN_SMASH_ENEMIES, "enemies" }, +#endif { EP_CAN_SMASH_EVERYTHING, "everything" }, { -1, NULL } }; -static int value_smash_targets = 0; -static struct ValueTextInfo options_access_type[] = +static struct ValueTextInfo options_slippery_type[] = { - { EP_WALKABLE, "walk" }, - { EP_PASSABLE, "pass" }, + { SLIPPERY_ANY_RANDOM, "random" }, + { SLIPPERY_ANY_LEFT_RIGHT, "left, right" }, + { SLIPPERY_ANY_RIGHT_LEFT, "right, left" }, + { SLIPPERY_ONLY_LEFT, "only left" }, + { SLIPPERY_ONLY_RIGHT, "only right" }, { -1, NULL } }; -static int value_access_type = 0; -static struct ValueTextInfo options_access_layer[] = +static struct ValueTextInfo options_deadliness[] = { - { EP_ACCESSIBLE_OVER, "over" }, - { EP_ACCESSIBLE_INSIDE, "inside" }, - { EP_ACCESSIBLE_UNDER, "under" }, + { EP_DONT_RUN_INTO, "running into" }, + { EP_DONT_COLLIDE_WITH, "colliding with" }, + { EP_DONT_TOUCH, "touching" }, + { -1, NULL } +}; + +static struct ValueTextInfo options_consistency[] = +{ + { EP_CAN_EXPLODE, "can explode" }, + { EP_INDESTRUCTIBLE, "indestructible" }, { -1, NULL } }; -static int value_access_layer = 0; static struct ValueTextInfo options_time_units[] = { @@ -960,25 +1005,34 @@ static struct ValueTextInfo options_change_player_action[] = { CE_PUSHED_BY_PLAYER, "pushed" }, { -1, NULL } }; -static int value_change_player_action = 0; -static struct ValueTextInfo options_change_impact_action[] = +static struct ValueTextInfo options_change_collide_action[] = { + { CE_COLLISION, "on collision" }, { CE_IMPACT, "on impact" }, { CE_SMASHED, "when smashed" }, { -1, NULL } }; -static int value_change_impact_action = 0; static struct ValueTextInfo options_change_other_action[] = { - { CE_OTHER_COLLECTING, "collecting" }, - { CE_OTHER_PUSHING, "pushing" }, - { CE_OTHER_CHANGING, "change of" }, - { CE_OTHER_EXPLODING, "explosion of" }, + { CE_OTHER_IS_TOUCHING, "touching" }, + { CE_OTHER_IS_CHANGING, "change of" }, + { CE_OTHER_IS_EXPLODING, "explosion of" }, + { CE_OTHER_GETS_TOUCHED, "player touches" }, + { CE_OTHER_GETS_PRESSED, "player presses" }, + { CE_OTHER_GETS_PUSHED, "player pushes" }, + { CE_OTHER_GETS_COLLECTED, "player collects" }, + { -1, NULL } +}; + +static struct ValueTextInfo options_change_power[] = +{ + { CP_NON_DESTRUCTIVE, "non-destructive" }, + { CP_HALF_DESTRUCTIVE, "half-destructive" }, + { CP_FULL_DESTRUCTIVE, "full-destructive" }, { -1, NULL } }; -static int value_change_other_action = 0; static struct { @@ -997,7 +1051,7 @@ static struct GADGET_ID_CUSTOM_ACCESS_TYPE, -1, options_access_type, - &value_access_type, + &custom_element.access_type, "player can", NULL, "type of access to this field" }, { @@ -1005,7 +1059,7 @@ static struct GADGET_ID_CUSTOM_ACCESS_LAYER, -1, options_access_layer, - &value_access_layer, + &custom_element.access_layer, NULL, NULL, "layer of access for this field" }, { @@ -1013,7 +1067,7 @@ static struct GADGET_ID_CUSTOM_WALK_TO_ACTION, -1, options_walk_to_action, - &value_walk_to_action, + &custom_element.walk_to_action, NULL, NULL, "diggable/collectible/pushable" }, { @@ -1045,15 +1099,23 @@ static struct GADGET_ID_CUSTOM_SMASH_TARGETS, -1, options_smash_targets, - &value_smash_targets, + &custom_element.smash_targets, "can smash", NULL, "elements that can be smashed" }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10), + GADGET_ID_CUSTOM_SLIPPERY_TYPE, + -1, + options_slippery_type, + &custom_element.slippery_type, + "slippery", NULL, "where other elements fall down" + }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_DEADLINESS, -1, options_deadliness, - &value_deadliness, + &custom_element.deadliness, "deadly when", NULL, "deadliness of element" }, { @@ -1061,7 +1123,7 @@ static struct GADGET_ID_CUSTOM_CONSISTENCY, -1, options_consistency, - &value_consistency, + &custom_element.consistency, NULL, "explodes to:", "consistency/destructibility" }, @@ -1080,15 +1142,15 @@ static struct GADGET_ID_CHANGE_PLAYER_ACTION, -1, options_change_player_action, - &value_change_player_action, + &custom_element.change_player_action, NULL, "by player", "type of player contact" }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(6), - GADGET_ID_CHANGE_IMPACT_ACTION, + GADGET_ID_CHANGE_COLLIDE_ACTION, -1, - options_change_impact_action, - &value_change_impact_action, + options_change_collide_action, + &custom_element.change_collide_action, NULL, NULL, "change after impact or smash" }, { @@ -1096,8 +1158,16 @@ static struct GADGET_ID_CHANGE_OTHER_ACTION, -1, options_change_other_action, - &value_change_other_action, - NULL, "other element:", "type of other element action" + &custom_element.change_other_action, + NULL, "element:", "type of other element action" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(10), + GADGET_ID_CHANGE_POWER, + -1, + options_change_power, + &custom_element.change.power, + "power:", NULL, "power of extended change" }, }; @@ -1125,7 +1195,7 @@ static struct 11, "Advanced", "Advanced element configuration" }, { - ED_SETTINGS_XPOS(0) + 262, ED_SETTINGS_YPOS(12), + ED_SETTINGS_XPOS(0) + 262, ED_SETTINGS_YPOS(13), GADGET_ID_SAVE_AS_TEMPLATE, -1, "Save as template", "Save current settings as new template" }, @@ -1319,7 +1389,7 @@ static struct ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_SLIPPERY, &custom_element_properties[EP_SLIPPERY], - "slippery", "other elements can fall down from it" + NULL, "other elements can fall down from it" }, { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11), @@ -1336,19 +1406,19 @@ static struct { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13), GADGET_ID_CUSTOM_EXPLODE_FIRE, - &custom_element_properties[EP_CAN_EXPLODE_BY_FIRE], + &custom_element.can_explode_by_fire, "by fire", "element can explode by fire/explosion" }, { ED_SETTINGS_XPOS(7), ED_SETTINGS_YPOS(13), GADGET_ID_CUSTOM_EXPLODE_SMASH, - &custom_element_properties[EP_CAN_EXPLODE_SMASHED], + &custom_element.can_explode_smashed, "smashed", "element can explode when smashed" }, { ED_SETTINGS_XPOS(13), ED_SETTINGS_YPOS(13), GADGET_ID_CUSTOM_EXPLODE_IMPACT, - &custom_element_properties[EP_CAN_EXPLODE_IMPACT], + &custom_element.can_explode_impact, "impact", "element can explode on impact" }, @@ -1380,8 +1450,8 @@ static struct }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), - GADGET_ID_CHANGE_IMPACT_SMASHED, - &custom_element_change_events[CE_IMPACT_SMASHED], + GADGET_ID_CHANGE_BY_COLLISION, + &custom_element_change_events[CE_BY_COLLISION], NULL, "element changes by impact or smash" }, { @@ -1391,9 +1461,33 @@ static struct NULL, "element changes by other element" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(12), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), + GADGET_ID_CHANGE_USE_EXPLOSION, + &custom_element.change.explode, + "explode instead of change", "element explodes instead of change" + }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), + GADGET_ID_CHANGE_USE_CONTENT, + &custom_element.change.use_content, + "use extended change target:", "element changes to more elements" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(11), + GADGET_ID_CHANGE_ONLY_COMPLETE, + &custom_element.change.only_complete, + "only use complete change", "only use complete extended content" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(12), + GADGET_ID_CHANGE_USE_RANDOM, + &custom_element.change.use_random_change, + NULL, "use random value for new content" + }, + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13), GADGET_ID_CUSTOM_USE_TEMPLATE, - &custom_element.use_template, + &level.use_custom_template, "use template", "use template for custom properties" }, }; @@ -1428,6 +1522,7 @@ static void ModifyEditorCounter(int, int); static void ModifyEditorCounterLimits(int, int, int); static void ModifyEditorSelectbox(int, int); static void ModifyEditorElementList(); +static void RedrawDrawingElements(); static void DrawDrawingWindow(); static void DrawLevelInfoWindow(); static void DrawPropertiesWindow(); @@ -2312,7 +2407,9 @@ static char *getElementInfoText(int element) if (element < NUM_FILE_ELEMENTS) { - if (element_info[element].custom_description != NULL) + if (strlen(element_info[element].description) > 0) + info_text = element_info[element].description; + else if (element_info[element].custom_description != NULL) info_text = element_info[element].custom_description; else if (element_info[element].editor_description != NULL) info_text = element_info[element].editor_description; @@ -2806,7 +2903,7 @@ static void CreateDrawingAreas() level_editor_gadget[id] = gi; - /* ... one areas for custom element explosion content ... */ + /* ... one area for custom element explosion content ... */ id = GADGET_ID_CUSTOM_CONTENT; gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, @@ -2845,6 +2942,26 @@ static void CreateDrawingAreas() level_editor_gadget[id] = gi; + /* ... one area for extended custom element change target content ... */ + id = GADGET_ID_CUSTOM_CHANGE_CONTENT; + gi = CreateGadget(GDI_CUSTOM_ID, id, + GDI_CUSTOM_TYPE_ID, i, + GDI_X, SX + ED_AREA_ELEM_CONTENT6_XPOS, + GDI_Y, SX + ED_AREA_ELEM_CONTENT6_YPOS, + GDI_WIDTH, 3 * MINI_TILEX, + GDI_HEIGHT, 3 * MINI_TILEY, + GDI_TYPE, GD_TYPE_DRAWING_AREA, + GDI_ITEM_SIZE, MINI_TILEX, MINI_TILEY, + GDI_EVENT_MASK, event_mask, + GDI_CALLBACK_INFO, HandleDrawingAreaInfo, + GDI_CALLBACK_ACTION, HandleDrawingAreas, + GDI_END); + + if (gi == NULL) + Error(ERR_EXIT, "cannot create gadget"); + + level_editor_gadget[id] = gi; + /* ... one for each custom element change trigger element ... */ id = GADGET_ID_CUSTOM_CHANGE_TRIGGER; gi = CreateGadget(GDI_CUSTOM_ID, id, @@ -3339,9 +3456,12 @@ static void MapTextInputGadget(int id) int x = textinput_info[id].x + xoffset_above; int y = textinput_info[id].y + yoffset_above; - sprintf(infotext, "%s:", textinput_info[id].infotext); - infotext[max_infotext_len] = '\0'; - DrawTextF(x, y, FONT_TEXT_1, infotext); + if (textinput_info[id].infotext) + { + sprintf(infotext, "%s:", textinput_info[id].infotext); + infotext[max_infotext_len] = '\0'; + DrawTextF(x, y, FONT_TEXT_1, infotext); + } ModifyGadget(level_editor_gadget[textinput_info[id].gadget_id], GDI_TEXT_VALUE, textinput_info[id].value, GDI_END); @@ -3473,6 +3593,9 @@ static void ResetUndoBuffer() static void DrawEditModeWindow() { + ModifyEditorElementList(); + RedrawDrawingElements(); + if (edit_mode == ED_MODE_INFO) DrawLevelInfoWindow(); else if (edit_mode == ED_MODE_PROPERTIES) @@ -3488,7 +3611,7 @@ static boolean LevelChanged() for(y=0; yx, gi->y, - el2edimg(custom_element.change.successor)); + el2edimg(custom_element.change.target_element)); MapDrawingArea(GADGET_ID_CUSTOM_CHANGE_TARGET); } +static void DrawCustomChangeContentArea() +{ + struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGE_CONTENT]; + int area_sx = SX + ED_AREA_ELEM_CONTENT6_XPOS; + int area_sy = SY + ED_AREA_ELEM_CONTENT6_YPOS; + int x, y; + + if (!IS_CUSTOM_ELEMENT(properties_element)) + { + /* this should never happen */ + Error(ERR_WARN, "element %d is no custom element", properties_element); + + return; + } + + DrawElementBorder(area_sx, area_sy, 3 * MINI_TILEX, 3 * MINI_TILEY, TRUE); + + for (y=0; y<3; y++) + for (x=0; x<3; x++) + DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX,gi->y + y * MINI_TILEY, + el2edimg(custom_element.change.content[x][y])); + + MapDrawingArea(GADGET_ID_CUSTOM_CHANGE_CONTENT); +} + static void DrawCustomChangeTriggerArea() { struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGE_TRIGGER]; @@ -4133,7 +4337,7 @@ static void DrawCustomChangeTriggerArea() DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); DrawMiniGraphicExt(drawto, gi->x, gi->y, - el2edimg(custom_element.change.trigger)); + el2edimg(custom_element.change.trigger_element)); MapDrawingArea(GADGET_ID_CUSTOM_CHANGE_TRIGGER); } @@ -4368,19 +4572,9 @@ static void DrawPropertiesTabulatorGadgets() int gd_y = gd->y + gd_gi->height - 1; Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y); int id_first = ED_TEXTBUTTON_ID_PROPERTIES_INFO; -#if 1 int id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG; -#else - int id_last = ED_TEXTBUTTON_ID_PROPERTIES_INFO; -#endif int i; -#if 0 - /* draw additional "configure" tabulator for configurable elements */ - if (checkPropertiesConfig()) - id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG; -#endif - /* draw additional "advanced" tabulator for custom elements */ if (IS_CUSTOM_ELEMENT(properties_element)) id_last = ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED; @@ -4669,9 +4863,22 @@ static void DrawPropertiesConfig() /* draw drawing area gadgets */ DrawCustomContentArea(); + + /* draw text input gadgets */ + MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME); } } +static void DrawPropertiesAdvancedDrawingAreas() +{ + DrawCustomGraphicElementArea(); + DrawCustomChangeTargetArea(); + DrawCustomChangeTriggerArea(); + DrawCustomChangeContentArea(); + + redraw_mask |= REDRAW_FIELD; +} + static void DrawPropertiesAdvanced() { int i; @@ -4698,9 +4905,7 @@ static void DrawPropertiesAdvanced() MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE); /* draw drawing area gadgets */ - DrawCustomGraphicElementArea(); - DrawCustomChangeTargetArea(); - DrawCustomChangeTriggerArea(); + DrawPropertiesAdvancedDrawingAreas(); } static void DrawElementName(int x, int y, int element) @@ -4760,12 +4965,6 @@ static void DrawPropertiesWindow() !IS_CUSTOM_ELEMENT(properties_element)) edit_mode_properties = ED_MODE_PROPERTIES_CONFIG; -#if 0 - if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG && - !checkPropertiesConfig()) - edit_mode_properties = ED_MODE_PROPERTIES_INFO; -#endif - if (IS_CUSTOM_ELEMENT(properties_element)) CopyCustomElementPropertiesToEditor(properties_element); @@ -4800,6 +4999,16 @@ static void DrawPropertiesWindow() DrawPropertiesAdvanced(); } +static void UpdateCustomElementGraphicGadgets() +{ + ModifyEditorElementList(); + RedrawDrawingElements(); + + if (edit_mode == ED_MODE_PROPERTIES && + edit_mode_properties == ED_MODE_PROPERTIES_ADVANCED) + DrawPropertiesAdvancedDrawingAreas(); +} + static void DrawLineElement(int sx, int sy, int element, boolean change_level) { int lx = sx + level_xpos; @@ -5534,27 +5743,36 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) { new_element = GFX_ELEMENT(new_element); custom_element.gfx_element = new_element; - element_info[properties_element] = custom_element; - ModifyEditorElementList(); - RedrawDrawingElements(); + CopyCustomElementPropertiesToGame(properties_element); + + UpdateCustomElementGraphicGadgets(); FrameCounter = 0; /* restart animation frame counter */ } else if (id == GADGET_ID_CUSTOM_CONTENT) { custom_element.content[sx][sy] = new_element; - element_info[properties_element] = custom_element; + + CopyCustomElementPropertiesToGame(properties_element); } else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) { - custom_element.change.successor = new_element; - element_info[properties_element] = custom_element; + custom_element.change.target_element = new_element; + + CopyCustomElementPropertiesToGame(properties_element); + } + else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) + { + custom_element.change.content[sx][sy] = new_element; + + CopyCustomElementPropertiesToGame(properties_element); } else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) { - custom_element.change.trigger = new_element; - element_info[properties_element] = custom_element; + custom_element.change.trigger_element = new_element; + + CopyCustomElementPropertiesToGame(properties_element); } else if (id == GADGET_ID_RANDOM_BACKGROUND) random_placement_background_element = new_element; @@ -5667,9 +5885,11 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) else if (id == GADGET_ID_CUSTOM_CONTENT) PickDrawingElement(button, custom_element.content[sx][sy]); else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - PickDrawingElement(button, custom_element.change.successor); + PickDrawingElement(button, custom_element.change.target_element); + else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) + PickDrawingElement(button, custom_element.change.content[sx][sy]); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - PickDrawingElement(button, custom_element.change.trigger); + PickDrawingElement(button, custom_element.change.trigger_element); else if (id == GADGET_ID_RANDOM_BACKGROUND) PickDrawingElement(button, random_placement_background_element); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && @@ -5751,7 +5971,16 @@ static void HandleCounterButtons(struct GadgetInfo *gi) static void HandleTextInputGadgets(struct GadgetInfo *gi) { - strcpy(textinput_info[gi->custom_type_id].value, gi->text.value); + int type_id = gi->custom_type_id; + + strcpy(textinput_info[type_id].value, gi->text.value); + + if (type_id == ED_TEXTINPUT_ID_ELEMENT_NAME) + { + CopyCustomElementPropertiesToGame(properties_element); + + ModifyEditorElementList(); /* update changed button info text */ + } } static void HandleSelectboxGadgets(struct GadgetInfo *gi) @@ -5770,13 +5999,26 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) static void HandleTextbuttonGadgets(struct GadgetInfo *gi) { - if (gi->custom_type_id >= ED_TEXTBUTTON_ID_PROPERTIES_INFO && - gi->custom_type_id <= ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED) + int type_id = gi->custom_type_id; + + if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_INFO && + type_id <= ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED) { edit_mode_properties = gi->custom_type_id; DrawPropertiesWindow(); } + else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE) + { + boolean new_template = (!LevelFileExists(-1)); + + if (new_template || + Request("Save this tem- plate and kill the old ?", REQ_ASK)) + SaveLevelTemplate(); + + if (new_template) + Request("Tem- plate saved !", REQ_CONFIRM); + } } static void HandleRadiobuttons(struct GadgetInfo *gi) @@ -5794,13 +6036,31 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) if ((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST && type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) || (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST && - type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST)) + type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST && + type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE)) + { CopyCustomElementPropertiesToGame(properties_element); + } if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC) { - ModifyEditorElementList(); - RedrawDrawingElements(); + UpdateCustomElementGraphicGadgets(); + } + else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) + { + if (level.use_custom_template && !LevelFileExists(-1)) + { + Request("No level tem- plate found !", REQ_CONFIRM); + + level.use_custom_template = FALSE; + ModifyGadget(gi, GDI_CHECKED, FALSE, GDI_END); + + return; + } + + LoadLevelTemplate(level.use_custom_template ? -1 : level_nr); + + DrawEditModeWindow(); } } @@ -6048,12 +6308,18 @@ static void HandleControlButtons(struct GadgetInfo *gi) Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM); else { - if (Request("Save this level and kill the old ?", REQ_ASK)) + boolean new_level = (!LevelFileExists(level_nr)); + + if (new_level || + Request("Save this level and kill the old ?", REQ_ASK)) { - CopyPlayfield(Feld, Ur); + CopyPlayfield(Feld, level.field); SaveLevel(level_nr); } + + if (new_level) + Request("Level saved !", REQ_CONFIRM); } break; @@ -6065,8 +6331,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (LevelChanged()) level.game_version = GAME_VERSION_ACTUAL; - CopyPlayfield(Ur, FieldBackup); - CopyPlayfield(Feld, Ur); + CopyPlayfield(level.field, FieldBackup); + CopyPlayfield(Feld, level.field); UnmapLevelEditorGadgets(); UndrawSpecialEditorDoor(); @@ -6399,30 +6665,33 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) { if (id == GADGET_ID_AMOEBA_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(level.amoeba_content)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(level.amoeba_content)); else if (id == GADGET_ID_CUSTOM_GRAPHIC) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(custom_element.use_gfx_element)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.gfx_element)); else if (id == GADGET_ID_CUSTOM_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(custom_element.content[sx][sy])); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.content[sx][sy])); else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(custom_element.change.successor)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.change.target_element)); + else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.change.content[sx][sy])); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(custom_element.change.trigger)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(custom_element.change.trigger_element)); else if (id == GADGET_ID_RANDOM_BACKGROUND) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(random_placement_background_element)); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(random_placement_background_element)); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && id <= GADGET_ID_ELEMENT_CONTENT_7) { int i = id - GADGET_ID_ELEMENT_CONTENT_0; - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "%s", getElementInfoText(level.yamyam_content[i][sx][sy])); + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", + getElementInfoText(level.yamyam_content[i][sx][sy])); } } else @@ -6439,6 +6708,9 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "New element after change"); + else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, + "New extended elements after change"); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "Other element triggering change");