X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=bfea8ee4ecf41ee3fd9e44f09d0a9a3989e269f6;hb=4096fcbae692bfbf2f6506786659872a60b31693;hp=c235a7c6bf4d5d5ee045319d10b815392bf97089;hpb=b21faa39ac22e1987db2bc6158374388e0090dfe;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index c235a7c6..bfea8ee4 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,7 +123,7 @@ #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 */ @@ -365,9 +366,10 @@ #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) @@ -376,16 +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_COLLIDE_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) -#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) -#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 13) +#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 + 14) +#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) @@ -511,8 +514,9 @@ /* 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 @@ -525,15 +529,16 @@ #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_COLLIDE_ACTION 11 -#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 12 -#define ED_SELECTBOX_ID_CHANGE_POWER 13 +#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 7 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 8 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 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 14 +#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 @@ -880,6 +885,13 @@ 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 } }; @@ -889,7 +901,6 @@ static struct ValueTextInfo options_access_type[] = { EP_PASSABLE, "pass" }, { -1, NULL } }; -static int value_access_type = 0; static struct ValueTextInfo options_access_layer[] = { @@ -898,7 +909,6 @@ static struct ValueTextInfo options_access_layer[] = { EP_ACCESSIBLE_UNDER, "under" }, { -1, NULL } }; -static int value_access_layer = 0; static struct ValueTextInfo options_walk_to_action[] = { @@ -907,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[] = { @@ -954,7 +963,16 @@ static struct ValueTextInfo options_smash_targets[] = { EP_CAN_SMASH_EVERYTHING, "everything" }, { -1, NULL } }; -static int value_smash_targets = 0; + +static struct ValueTextInfo options_slippery_type[] = +{ + { 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 struct ValueTextInfo options_deadliness[] = { @@ -963,7 +981,6 @@ static struct ValueTextInfo options_deadliness[] = { EP_DONT_TOUCH, "touching" }, { -1, NULL } }; -static int value_deadliness = 0; static struct ValueTextInfo options_consistency[] = { @@ -971,7 +988,6 @@ static struct ValueTextInfo options_consistency[] = { EP_INDESTRUCTIBLE, "indestructible" }, { -1, NULL } }; -static int value_consistency = 0; static struct ValueTextInfo options_time_units[] = { @@ -987,7 +1003,6 @@ 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_collide_action[] = { @@ -996,19 +1011,18 @@ static struct ValueTextInfo options_change_collide_action[] = { CE_SMASHED, "when smashed" }, { -1, NULL } }; -static int value_change_collide_action = 0; static struct ValueTextInfo options_change_other_action[] = { - { CE_OTHER_COLLECTING, "collecting" }, - { CE_OTHER_TOUCHING, "touching" }, - { CE_OTHER_PRESSING, "pressing" }, - { CE_OTHER_PUSHING, "pushing" }, - { CE_OTHER_CHANGING, "change of" }, - { CE_OTHER_EXPLODING, "explosion of" }, - { -1, NULL } + { CE_OTHER_IS_TOUCHING, "touching" }, + { CE_OTHER_IS_CHANGING, "change of" }, + { CE_OTHER_IS_EXPLODING, "explosion of" }, + { CE_OTHER_GETS_TOUCHED, "player touches" }, + { CE_OTHER_GETS_PRESSED, "player presses" }, + { CE_OTHER_GETS_PUSHED, "player pushes" }, + { CE_OTHER_GETS_COLLECTED, "player collects" }, + { -1, NULL } }; -static int value_change_other_action = 0; static struct ValueTextInfo options_change_power[] = { @@ -1035,7 +1049,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" }, { @@ -1043,7 +1057,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" }, { @@ -1051,7 +1065,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" }, { @@ -1083,15 +1097,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" }, { @@ -1099,7 +1121,7 @@ static struct GADGET_ID_CUSTOM_CONSISTENCY, -1, options_consistency, - &value_consistency, + &custom_element.consistency, NULL, "explodes to:", "consistency/destructibility" }, @@ -1118,7 +1140,7 @@ 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" }, { @@ -1126,7 +1148,7 @@ static struct GADGET_ID_CHANGE_COLLIDE_ACTION, -1, options_change_collide_action, - &value_change_collide_action, + &custom_element.change_collide_action, NULL, NULL, "change after impact or smash" }, { @@ -1134,8 +1156,8 @@ 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), @@ -1365,7 +1387,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), @@ -1382,19 +1404,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" }, @@ -1463,7 +1485,7 @@ static struct { 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" }, }; @@ -2382,7 +2404,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; @@ -3429,9 +3453,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); @@ -3612,6 +3639,9 @@ static void CopyCustomElementPropertiesToEditor(int element) { int i; + /* needed here to initialize combined element properties */ + InitElementPropertiesEngine(level.game_version); + custom_element = element_info[properties_element]; for (i=0; i < NUM_ELEMENT_PROPERTIES; i++) @@ -3620,155 +3650,189 @@ static void CopyCustomElementPropertiesToEditor(int element) for (i=0; i < NUM_CHANGE_EVENTS; i++) custom_element_change_events[i] = HAS_CHANGE_EVENT(element, i); + /* ---------- element settings: configure (custom elements) ------------- */ + + /* set accessible layer selectbox help value */ + custom_element.access_type = + (IS_WALKABLE(element) ? EP_WALKABLE : + IS_PASSABLE(element) ? EP_PASSABLE : + custom_element.access_type); + custom_element.access_layer = + (IS_ACCESSIBLE_OVER(element) ? EP_ACCESSIBLE_OVER : + IS_ACCESSIBLE_INSIDE(element) ? EP_ACCESSIBLE_INSIDE : + IS_ACCESSIBLE_UNDER(element) ? EP_ACCESSIBLE_UNDER : + custom_element.access_layer); + custom_element_properties[EP_ACCESSIBLE] = + (IS_ACCESSIBLE_OVER(element) || + IS_ACCESSIBLE_INSIDE(element) || + IS_ACCESSIBLE_UNDER(element)); + /* set walk-to-object action selectbox help value */ - value_walk_to_action = + custom_element.walk_to_action = (IS_DIGGABLE(element) ? EP_DIGGABLE : IS_COLLECTIBLE(element) ? EP_COLLECTIBLE : IS_PUSHABLE(element) ? EP_PUSHABLE : - EP_DIGGABLE); + custom_element.walk_to_action); custom_element_properties[EP_WALK_TO_OBJECT] = (IS_DIGGABLE(element) || IS_COLLECTIBLE(element) || IS_PUSHABLE(element)); - /* set consistency selectbox help value */ - value_consistency = - (CAN_EXPLODE(element) ? EP_CAN_EXPLODE : - IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE : - EP_CAN_EXPLODE); - custom_element_properties[EP_EXPLODE_RESULT] = - (CAN_EXPLODE(element) || - IS_INDESTRUCTIBLE(element)); + /* set smash targets selectbox help value */ + custom_element.smash_targets = + (CAN_SMASH_EVERYTHING(element) ? EP_CAN_SMASH_EVERYTHING : + CAN_SMASH_ENEMIES(element) ? EP_CAN_SMASH_ENEMIES : + CAN_SMASH_PLAYER(element) ? EP_CAN_SMASH_PLAYER : + custom_element.smash_targets); + custom_element_properties[EP_CAN_SMASH] = + (CAN_SMASH_EVERYTHING(element) || + CAN_SMASH_ENEMIES(element) || + CAN_SMASH_PLAYER(element)); /* set deadliness selectbox help value */ - value_deadliness = + custom_element.deadliness = (DONT_TOUCH(element) ? EP_DONT_TOUCH : DONT_COLLIDE_WITH(element) ? EP_DONT_COLLIDE_WITH : DONT_RUN_INTO(element) ? EP_DONT_RUN_INTO : - EP_DONT_RUN_INTO); + custom_element.deadliness); custom_element_properties[EP_DEADLY] = (DONT_TOUCH(element) || DONT_COLLIDE_WITH(element) || DONT_RUN_INTO(element)); - /* set smash targets selectbox help value */ - value_smash_targets = - (CAN_SMASH_EVERYTHING(element) ? EP_CAN_SMASH_EVERYTHING : - CAN_SMASH_ENEMIES(element) ? EP_CAN_SMASH_ENEMIES : - CAN_SMASH_PLAYER(element) ? EP_CAN_SMASH_PLAYER : - EP_CAN_SMASH_PLAYER); - custom_element_properties[EP_CAN_SMASH] = - (CAN_SMASH_EVERYTHING(element) || - CAN_SMASH_ENEMIES(element) || - CAN_SMASH_PLAYER(element)); + /* set consistency selectbox help value */ + custom_element.consistency = + (IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE : + CAN_EXPLODE(element) ? EP_CAN_EXPLODE : + custom_element.consistency); + custom_element_properties[EP_EXPLODE_RESULT] = + (IS_INDESTRUCTIBLE(element) || + CAN_EXPLODE(element)); - /* set accessible layer selectbox help value */ - value_access_type = - (IS_WALKABLE(element) ? EP_WALKABLE : - IS_PASSABLE(element) ? EP_PASSABLE : - EP_WALKABLE); - value_access_layer = - (IS_ACCESSIBLE_OVER(element) ? EP_ACCESSIBLE_OVER : - IS_ACCESSIBLE_INSIDE(element) ? EP_ACCESSIBLE_INSIDE : - IS_ACCESSIBLE_UNDER(element) ? EP_ACCESSIBLE_UNDER : - EP_ACCESSIBLE_OVER); - custom_element_properties[EP_ACCESSIBLE] = - (IS_ACCESSIBLE_OVER(element) || - IS_ACCESSIBLE_INSIDE(element) || - IS_ACCESSIBLE_UNDER(element)); + /* special case: sub-settings dependent from main setting */ + if (CAN_EXPLODE_BY_FIRE(element)) + custom_element.can_explode_by_fire = TRUE; + if (CAN_EXPLODE_SMASHED(element)) + custom_element.can_explode_smashed = TRUE; + if (CAN_EXPLODE_IMPACT(element)) + custom_element.can_explode_impact = TRUE; + + /* ---------- element settings: advanced (custom elements) --------------- */ /* set change by player selectbox help value */ - value_change_player_action = + custom_element.change_player_action = (HAS_CHANGE_EVENT(element, CE_PUSHED_BY_PLAYER) ? CE_PUSHED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_PRESSED_BY_PLAYER) ? CE_PRESSED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_TOUCHED_BY_PLAYER) ? CE_TOUCHED_BY_PLAYER : - CE_PRESSED_BY_PLAYER); + custom_element.change_player_action); - /* set change by impact/smash selectbox help value */ - value_change_collide_action = + /* set change by collision selectbox help value */ + custom_element.change_collide_action = (HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED : HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT : HAS_CHANGE_EVENT(element, CE_COLLISION) ? CE_COLLISION : - CE_COLLISION); + custom_element.change_collide_action); /* set change by other element action selectbox help value */ - value_change_other_action = - (HAS_CHANGE_EVENT(element, CE_OTHER_EXPLODING) ? CE_OTHER_EXPLODING : - HAS_CHANGE_EVENT(element, CE_OTHER_CHANGING) ? CE_OTHER_CHANGING : - HAS_CHANGE_EVENT(element, CE_OTHER_PUSHING) ? CE_OTHER_PUSHING : - HAS_CHANGE_EVENT(element, CE_OTHER_PRESSING) ? CE_OTHER_PRESSING : - HAS_CHANGE_EVENT(element, CE_OTHER_TOUCHING) ? CE_OTHER_TOUCHING : - HAS_CHANGE_EVENT(element, CE_OTHER_COLLECTING) ? CE_OTHER_COLLECTING : - CE_OTHER_COLLECTING); + custom_element.change_other_action = + (HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED : + HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PUSHED) ? CE_OTHER_GETS_PUSHED : + HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PRESSED) ? CE_OTHER_GETS_PRESSED : + HAS_CHANGE_EVENT(element, CE_OTHER_GETS_TOUCHED) ? CE_OTHER_GETS_TOUCHED : + HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING : + HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING : + HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING : + custom_element.change_other_action); } static void CopyCustomElementPropertiesToGame(int element) { int i; + int access_type_and_layer; element_info[properties_element] = custom_element; + /* ---------- element settings: configure (custom elements) ------------- */ + + /* set accessible property from checkbox and selectbox */ + custom_element_properties[EP_WALKABLE_OVER] = FALSE; + custom_element_properties[EP_WALKABLE_INSIDE] = FALSE; + custom_element_properties[EP_WALKABLE_UNDER] = FALSE; + custom_element_properties[EP_PASSABLE_OVER] = FALSE; + custom_element_properties[EP_PASSABLE_INSIDE] = FALSE; + custom_element_properties[EP_PASSABLE_UNDER] = FALSE; + access_type_and_layer = ((custom_element.access_type == EP_WALKABLE ? + EP_WALKABLE_OVER : EP_PASSABLE_OVER) + + (custom_element.access_layer - EP_ACCESSIBLE_OVER)); + custom_element_properties[access_type_and_layer] = + custom_element_properties[EP_ACCESSIBLE]; + /* set walk-to-object property from checkbox and selectbox */ custom_element_properties[EP_DIGGABLE] = FALSE; custom_element_properties[EP_COLLECTIBLE] = FALSE; custom_element_properties[EP_PUSHABLE] = FALSE; - custom_element_properties[value_walk_to_action] = + custom_element_properties[custom_element.walk_to_action] = custom_element_properties[EP_WALK_TO_OBJECT]; - /* set consistency property from checkbox and selectbox */ - custom_element_properties[EP_CAN_EXPLODE] = FALSE; - custom_element_properties[EP_INDESTRUCTIBLE] = FALSE; - custom_element_properties[value_consistency] = - custom_element_properties[EP_EXPLODE_RESULT]; + /* set smash property from checkbox and selectbox */ + custom_element_properties[EP_CAN_SMASH_PLAYER] = FALSE; + custom_element_properties[EP_CAN_SMASH_ENEMIES] = FALSE; + custom_element_properties[EP_CAN_SMASH_EVERYTHING] = FALSE; + custom_element_properties[custom_element.smash_targets] = + custom_element_properties[EP_CAN_SMASH]; /* 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_TOUCH] = FALSE; - custom_element_properties[value_deadliness] = + custom_element_properties[custom_element.deadliness] = custom_element_properties[EP_DEADLY]; - /* set smash property from checkbox and selectbox */ - custom_element_properties[EP_CAN_SMASH_PLAYER] = FALSE; - custom_element_properties[EP_CAN_SMASH_ENEMIES] = FALSE; - custom_element_properties[EP_CAN_SMASH_EVERYTHING] = FALSE; - custom_element_properties[value_smash_targets] = - custom_element_properties[EP_CAN_SMASH]; + /* set consistency property from checkbox and selectbox */ + custom_element_properties[EP_INDESTRUCTIBLE] = FALSE; + custom_element_properties[EP_CAN_EXPLODE] = FALSE; + custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = FALSE; + custom_element_properties[EP_CAN_EXPLODE_SMASHED] = FALSE; + custom_element_properties[EP_CAN_EXPLODE_IMPACT] = FALSE; + custom_element_properties[custom_element.consistency] = + custom_element_properties[EP_EXPLODE_RESULT]; - /* set accessible property from checkbox and selectbox */ - custom_element_properties[EP_WALKABLE_OVER] = FALSE; - custom_element_properties[EP_WALKABLE_INSIDE] = FALSE; - custom_element_properties[EP_WALKABLE_UNDER] = FALSE; - custom_element_properties[EP_PASSABLE_OVER] = FALSE; - custom_element_properties[EP_PASSABLE_INSIDE] = FALSE; - custom_element_properties[EP_PASSABLE_UNDER] = FALSE; - custom_element_properties[((value_access_type == EP_WALKABLE ? - EP_WALKABLE_OVER : EP_PASSABLE_OVER) + - (value_access_layer - EP_ACCESSIBLE_OVER))] = - custom_element_properties[EP_ACCESSIBLE]; + /* special case: sub-settings dependent from main setting */ + if (custom_element_properties[EP_CAN_EXPLODE]) + { + custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = + custom_element.can_explode_by_fire; + custom_element_properties[EP_CAN_EXPLODE_SMASHED] = + custom_element.can_explode_smashed; + custom_element_properties[EP_CAN_EXPLODE_IMPACT] = + custom_element.can_explode_impact; + } + + /* ---------- element settings: advanced (custom elements) --------------- */ /* set player change event from checkbox and selectbox */ custom_element_change_events[CE_TOUCHED_BY_PLAYER] = FALSE; custom_element_change_events[CE_PRESSED_BY_PLAYER] = FALSE; custom_element_change_events[CE_PUSHED_BY_PLAYER] = FALSE; - custom_element_change_events[value_change_player_action] = + custom_element_change_events[custom_element.change_player_action] = custom_element_change_events[CE_BY_PLAYER]; - /* set player change event from checkbox and selectbox */ + /* set collision change event from checkbox and selectbox */ custom_element_change_events[CE_COLLISION] = FALSE; custom_element_change_events[CE_IMPACT] = FALSE; custom_element_change_events[CE_SMASHED] = FALSE; - custom_element_change_events[value_change_collide_action] = + custom_element_change_events[custom_element.change_collide_action] = custom_element_change_events[CE_BY_COLLISION]; /* set other element action change event from checkbox and selectbox */ - custom_element_change_events[CE_OTHER_COLLECTING] = FALSE; - custom_element_change_events[CE_OTHER_TOUCHING] = FALSE; - custom_element_change_events[CE_OTHER_PRESSING] = FALSE; - custom_element_change_events[CE_OTHER_PUSHING] = FALSE; - custom_element_change_events[CE_OTHER_CHANGING] = FALSE; - custom_element_change_events[CE_OTHER_EXPLODING] = FALSE; - custom_element_change_events[value_change_other_action] = + custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE; + custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE; + custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE; + custom_element_change_events[CE_OTHER_GETS_TOUCHED] = FALSE; + custom_element_change_events[CE_OTHER_GETS_PRESSED] = FALSE; + custom_element_change_events[CE_OTHER_GETS_PUSHED] = FALSE; + custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE; + custom_element_change_events[custom_element.change_other_action] = custom_element_change_events[CE_BY_OTHER]; for (i=0; i < NUM_ELEMENT_PROPERTIES; i++) @@ -3829,6 +3893,7 @@ void DrawLevelEd() redraw_mask |= REDRAW_ALL; ReinitializeElementListButtons(); /* only needed after setup changes */ + ModifyEditorElementList(); /* may be needed for custom elements */ UnmapTapeButtons(); MapControlButtons(); @@ -4254,7 +4319,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); } @@ -4489,19 +4554,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; @@ -4790,9 +4845,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; @@ -4819,10 +4887,7 @@ static void DrawPropertiesAdvanced() MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE); /* draw drawing area gadgets */ - DrawCustomGraphicElementArea(); - DrawCustomChangeTargetArea(); - DrawCustomChangeContentArea(); - DrawCustomChangeTriggerArea(); + DrawPropertiesAdvancedDrawingAreas(); } static void DrawElementName(int x, int y, int element) @@ -4882,12 +4947,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); @@ -5661,6 +5720,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) ModifyEditorElementList(); RedrawDrawingElements(); + DrawPropertiesAdvancedDrawingAreas(); + FrameCounter = 0; /* restart animation frame counter */ } else if (id == GADGET_ID_CUSTOM_CONTENT) @@ -5680,7 +5741,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) } else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) { - custom_element.change.trigger = new_element; + custom_element.change.trigger_element = new_element; element_info[properties_element] = custom_element; } else if (id == GADGET_ID_RANDOM_BACKGROUND) @@ -5798,7 +5859,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) 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 && @@ -5880,7 +5941,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) @@ -5930,6 +6000,8 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) { ModifyEditorElementList(); RedrawDrawingElements(); + + DrawPropertiesAdvancedDrawingAreas(); } } @@ -6544,7 +6616,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) 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)); + 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));