X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=d17e9684b8c7b95de18bc5aed712c782b595c910;hb=a3d3dca44696b194dbe3f49a97d8c92d92b42ecf;hp=941cc4da155f7aa18880e35c8592795302feac70;hpb=615b4e129452323d6e194b20dfa844ce6decd8c2;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 941cc4da..d17e9684 100644 --- a/src/editor.c +++ b/src/editor.c @@ -625,8 +625,8 @@ enum GADGET_ID_BD_MAGIC_WALL_NITRO_PACK_TO, GADGET_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO, GADGET_ID_BD_MAGIC_WALL_FLYING_ROCK_TO, - GADGET_ID_BD_AMOEBA_CONTENT_TOO_BIG, - GADGET_ID_BD_AMOEBA_CONTENT_ENCLOSED, + GADGET_ID_BD_AMOEBA_1_CONTENT_TOO_BIG, + GADGET_ID_BD_AMOEBA_1_CONTENT_ENCLOSED, GADGET_ID_BD_AMOEBA_2_CONTENT_TOO_BIG, GADGET_ID_BD_AMOEBA_2_CONTENT_ENCLOSED, GADGET_ID_BD_AMOEBA_2_CONTENT_EXPLODING, @@ -648,9 +648,9 @@ enum GADGET_ID_BD_ROCK_TURNS_TO_ON_IMPACT, GADGET_ID_BD_DIAMOND_TURNS_TO_ON_FALLING, GADGET_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT, - GADGET_ID_BD_FIREFLY_EXPLODES_TO, + GADGET_ID_BD_FIREFLY_1_EXPLODES_TO, GADGET_ID_BD_FIREFLY_2_EXPLODES_TO, - GADGET_ID_BD_BUTTERFLY_EXPLODES_TO, + GADGET_ID_BD_BUTTERFLY_1_EXPLODES_TO, GADGET_ID_BD_BUTTERFLY_2_EXPLODES_TO, GADGET_ID_BD_STONEFLY_EXPLODES_TO, GADGET_ID_BD_DRAGONFLY_EXPLODES_TO, @@ -680,6 +680,13 @@ enum GADGET_ID_LEVEL_AUTHOR, GADGET_ID_LEVELSET_NAME, GADGET_ID_LEVELSET_AUTHOR, + GADGET_ID_BD_COLOR_TEXT_B, + GADGET_ID_BD_COLOR_TEXT_0, + GADGET_ID_BD_COLOR_TEXT_1, + GADGET_ID_BD_COLOR_TEXT_2, + GADGET_ID_BD_COLOR_TEXT_3, + GADGET_ID_BD_COLOR_TEXT_4, + GADGET_ID_BD_COLOR_TEXT_5, GADGET_ID_ELEMENT_NAME, // text area identifiers @@ -691,8 +698,16 @@ enum GADGET_ID_TIME_OR_STEPS, GADGET_ID_TIME_SCORE_BASE, GADGET_ID_GAME_ENGINE_TYPE, - GADGET_ID_BD_SCHEDULING_TYPE, GADGET_ID_LEVELSET_SAVE_MODE, + GADGET_ID_BD_SCHEDULING_TYPE, + GADGET_ID_BD_COLOR_TYPE, + GADGET_ID_BD_COLOR_C64_B, + GADGET_ID_BD_COLOR_C64_0, + GADGET_ID_BD_COLOR_C64_1, + GADGET_ID_BD_COLOR_C64_2, + GADGET_ID_BD_COLOR_C64_3, + GADGET_ID_BD_COLOR_C64_4, + GADGET_ID_BD_COLOR_C64_5, GADGET_ID_WIND_DIRECTION, GADGET_ID_PLAYER_SPEED, GADGET_ID_BD_GRAVITY_DIRECTION, @@ -741,6 +756,7 @@ enum GADGET_ID_SAVE_LEVELSET, GADGET_ID_ADD_CHANGE_PAGE, GADGET_ID_DEL_CHANGE_PAGE, + GADGET_ID_BD_SET_RANDOM_COLORS, // graphicbutton identifiers @@ -995,6 +1011,13 @@ enum ED_TEXTINPUT_ID_LEVEL_AUTHOR, ED_TEXTINPUT_ID_LEVELSET_NAME, ED_TEXTINPUT_ID_LEVELSET_AUTHOR, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_B, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_0, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_1, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_2, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_3, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_4, + ED_TEXTINPUT_ID_BD_COLOR_TEXT_5, ED_TEXTINPUT_ID_ELEMENT_NAME, ED_NUM_TEXTINPUT @@ -1006,6 +1029,9 @@ enum #define ED_TEXTINPUT_ID_LEVELSET_FIRST ED_TEXTINPUT_ID_LEVELSET_NAME #define ED_TEXTINPUT_ID_LEVELSET_LAST ED_TEXTINPUT_ID_LEVELSET_AUTHOR +#define ED_TEXTINPUT_ID_COLORS_FIRST ED_TEXTINPUT_ID_BD_COLOR_TEXT_B +#define ED_TEXTINPUT_ID_COLORS_LAST ED_TEXTINPUT_ID_BD_COLOR_TEXT_5 + // values for text area gadgets enum { @@ -1023,8 +1049,16 @@ enum ED_SELECTBOX_ID_TIME_OR_STEPS, ED_SELECTBOX_ID_TIME_SCORE_BASE, ED_SELECTBOX_ID_GAME_ENGINE_TYPE, - ED_SELECTBOX_ID_BD_SCHEDULING_TYPE, ED_SELECTBOX_ID_LEVELSET_SAVE_MODE, + ED_SELECTBOX_ID_BD_SCHEDULING_TYPE, + ED_SELECTBOX_ID_BD_COLOR_TYPE, + ED_SELECTBOX_ID_BD_COLOR_C64_B, + ED_SELECTBOX_ID_BD_COLOR_C64_0, + ED_SELECTBOX_ID_BD_COLOR_C64_1, + ED_SELECTBOX_ID_BD_COLOR_C64_2, + ED_SELECTBOX_ID_BD_COLOR_C64_3, + ED_SELECTBOX_ID_BD_COLOR_C64_4, + ED_SELECTBOX_ID_BD_COLOR_C64_5, ED_SELECTBOX_ID_WIND_DIRECTION, ED_SELECTBOX_ID_PLAYER_SPEED, ED_SELECTBOX_ID_BD_GRAVITY_DIRECTION, @@ -1067,6 +1101,9 @@ enum #define ED_SELECTBOX_ID_ENGINE_FIRST ED_SELECTBOX_ID_BD_SCHEDULING_TYPE #define ED_SELECTBOX_ID_ENGINE_LAST ED_SELECTBOX_ID_BD_SCHEDULING_TYPE +#define ED_SELECTBOX_ID_COLORS_FIRST ED_SELECTBOX_ID_BD_COLOR_C64_B +#define ED_SELECTBOX_ID_COLORS_LAST ED_SELECTBOX_ID_BD_COLOR_C64_5 + #define ED_SELECTBOX_ID_CUSTOM1_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE #define ED_SELECTBOX_ID_CUSTOM1_LAST ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION #define ED_SELECTBOX_ID_CUSTOM2_FIRST ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN @@ -1096,6 +1133,7 @@ enum ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1, ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE, ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE, + ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS, ED_NUM_TEXTBUTTONS }; @@ -1301,8 +1339,8 @@ enum ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO, ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO, ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO, - ED_DRAWING_ID_BD_AMOEBA_CONTENT_TOO_BIG, - ED_DRAWING_ID_BD_AMOEBA_CONTENT_ENCLOSED, + ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_TOO_BIG, + ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_ENCLOSED, ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_TOO_BIG, ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_ENCLOSED, ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_EXPLODING, @@ -1324,9 +1362,9 @@ enum ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_IMPACT, ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_FALLING, ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT, - ED_DRAWING_ID_BD_FIREFLY_EXPLODES_TO, + ED_DRAWING_ID_BD_FIREFLY_1_EXPLODES_TO, ED_DRAWING_ID_BD_FIREFLY_2_EXPLODES_TO, - ED_DRAWING_ID_BD_BUTTERFLY_EXPLODES_TO, + ED_DRAWING_ID_BD_BUTTERFLY_1_EXPLODES_TO, ED_DRAWING_ID_BD_BUTTERFLY_2_EXPLODES_TO, ED_DRAWING_ID_BD_STONEFLY_EXPLODES_TO, ED_DRAWING_ID_BD_DRAGONFLY_EXPLODES_TO, @@ -1627,6 +1665,25 @@ static boolean levelset_use_levelset_artwork = FALSE; static boolean levelset_copy_level_template = FALSE; static int levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE; +#define MAX_BD_COLORS 7 +#define MAX_BD_COLOR_TEXT_LEN 10 + +static boolean bd_color_type_changed = FALSE; +static int bd_color_type_default = GD_COLOR_TYPE_RGB; +static int bd_color_c64[MAX_BD_COLORS]; +static char bd_color_text[MAX_BD_COLORS][MAX_BD_COLOR_TEXT_LEN + 1]; +static int bd_color_default[MAX_BD_COLORS]; +static int *bd_color[MAX_BD_COLORS] = +{ + &level.bd_color_b, + &level.bd_color_0, + &level.bd_color_1, + &level.bd_color_2, + &level.bd_color_3, + &level.bd_color_4, + &level.bd_color_5, +}; + static struct { int gadget_type_id; @@ -2064,16 +2121,18 @@ static struct int gadget_id; int size; char *value; - char *text_above, *infotext; + char *text_above, *text_left, *text_right, *infotext; } textinput_info[ED_NUM_TEXTINPUT] = { + // ---------- level and editor settings ------------------------------------- + { ED_TEXTINPUT_ID_LEVEL_NAME, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0), GADGET_ID_LEVEL_NAME, MAX_LEVEL_NAME_LEN, level.name, - "Title:", "Title for this level" + "Title:", NULL, NULL, "Enter title for this level" }, { ED_TEXTINPUT_ID_LEVEL_AUTHOR, @@ -2081,7 +2140,7 @@ static struct GADGET_ID_LEVEL_AUTHOR, MAX_LEVEL_AUTHOR_LEN, level.author, - "Author:", "Author for this level" + "Author:", NULL, NULL, "Enter author for this level" }, { ED_TEXTINPUT_ID_LEVELSET_NAME, @@ -2089,7 +2148,7 @@ static struct GADGET_ID_LEVELSET_NAME, MAX_LEVEL_NAME_LEN, levelset_name, - "Title:", "Title for this or new level set" + "Title:", NULL, NULL, "Enter title for this or new level set" }, { ED_TEXTINPUT_ID_LEVELSET_AUTHOR, @@ -2097,15 +2156,77 @@ static struct GADGET_ID_LEVELSET_AUTHOR, MAX_LEVEL_AUTHOR_LEN, levelset_author, - "Author:", "Author for this or new level set" + "Author:", NULL, NULL, "Enter author for this or new level set" + }, + + // ---------- engine settings: colors --------------------------------------- + + { + ED_TEXTINPUT_ID_BD_COLOR_TEXT_B, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(1), + GADGET_ID_BD_COLOR_TEXT_B, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[0], + NULL, "Border color: ", NULL, "Enter border color (not used)" + }, + { + ED_TEXTINPUT_ID_BD_COLOR_TEXT_0, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(2), + GADGET_ID_BD_COLOR_TEXT_0, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[1], + NULL, "Background color: ", NULL, "Enter background color (C64 graphics)" + }, + { + ED_TEXTINPUT_ID_BD_COLOR_TEXT_1, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(3), + GADGET_ID_BD_COLOR_TEXT_1, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[2], + NULL, "Sand color: ", NULL, "Enter sand color (C64 graphics)" + }, + { + ED_TEXTINPUT_ID_BD_COLOR_TEXT_2, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(4), + GADGET_ID_BD_COLOR_TEXT_2, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[3], + NULL, "Steel wall color: ", NULL, "Enter steel wall color (C64 graphics)" + }, + { + ED_TEXTINPUT_ID_BD_COLOR_TEXT_3, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(5), + GADGET_ID_BD_COLOR_TEXT_3, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[4], + NULL, "Wall color: ", NULL, "Enter wall color (C64 graphics)" + }, + { + ED_TEXTINPUT_ID_BD_COLOR_TEXT_4, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(6), + GADGET_ID_BD_COLOR_TEXT_4, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[5], + NULL, "Amoeba color: ", NULL, "Enter amoeba color (C64 graphics)" + }, + { + ED_TEXTINPUT_ID_BD_COLOR_TEXT_5, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(7), + GADGET_ID_BD_COLOR_TEXT_5, + MAX_BD_COLOR_TEXT_LEN, + bd_color_text[6], + NULL, "Slime color: ", NULL, "Enter slime color (C64 graphics)" }, + + // ---------- element settings: configure (several elements) ---------------- + { ED_TEXTINPUT_ID_ELEMENT_NAME, -1, -1, // these values are not constant, but can change at runtime GADGET_ID_ELEMENT_NAME, MAX_ELEMENT_NAME_LEN - 2, // currently 2 chars less editable custom_element.description, - NULL, "Element name" + NULL, NULL, NULL, "Enter element name" } }; @@ -2848,6 +2969,38 @@ static struct ValueTextInfo options_bd_scheduling_type[] = { -1, NULL } }; +static struct ValueTextInfo options_bd_color_type[] = +{ + { GD_COLOR_TYPE_RGB, "RGB colors" }, + { GD_COLOR_TYPE_C64, "C64 colors" }, + { GD_COLOR_TYPE_C64DTV, "C64DTV colors" }, + { GD_COLOR_TYPE_ATARI, "Atari colors" }, + + { -1, NULL } +}; + +static struct ValueTextInfo options_bd_color_c64_name[] = +{ + { GD_COLOR_INDEX_BLACK, "Black" }, + { GD_COLOR_INDEX_WHITE, "White" }, + { GD_COLOR_INDEX_RED, "Red" }, + { GD_COLOR_INDEX_CYAN, "Cyan" }, + { GD_COLOR_INDEX_PURPLE, "Purple" }, + { GD_COLOR_INDEX_GREEN, "Green" }, + { GD_COLOR_INDEX_BLUE, "Blue" }, + { GD_COLOR_INDEX_YELLOW, "Yellow" }, + { GD_COLOR_INDEX_ORANGE, "Orange" }, + { GD_COLOR_INDEX_BROWN, "Brown" }, + { GD_COLOR_INDEX_LIGHTRED, "Light red" }, + { GD_COLOR_INDEX_GRAY1, "Dark gray" }, + { GD_COLOR_INDEX_GRAY2, "Gray" }, + { GD_COLOR_INDEX_LIGHTGREEN, "Light green" }, + { GD_COLOR_INDEX_LIGHTBLUE, "Light blue" }, + { GD_COLOR_INDEX_GRAY3, "Light gray" }, + + { -1, NULL } +}; + static struct ValueTextInfo *action_arg_modes[] = { options_action_mode_none, @@ -2931,6 +3084,18 @@ static struct &level.game_engine_type, NULL, "Game engine:", NULL, "Select game engine" }, + { + ED_SELECTBOX_ID_LEVELSET_SAVE_MODE, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10), + GADGET_ID_LEVELSET_SAVE_MODE, GADGET_ID_NONE, + -1, + options_levelset_save_mode, + &levelset_save_mode, + "Action:", NULL, NULL, "Select action when saving level set" + }, + + // ---------- engine settings: config --------------------------------------- + { ED_SELECTBOX_ID_BD_SCHEDULING_TYPE, ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(1), @@ -2940,14 +3105,81 @@ static struct &level.bd_scheduling_type, NULL, "Scheduling type:", NULL, "Select level timing" }, + + // ---------- engine settings: colors --------------------------------------- + { - ED_SELECTBOX_ID_LEVELSET_SAVE_MODE, - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10), - GADGET_ID_LEVELSET_SAVE_MODE, GADGET_ID_NONE, + ED_SELECTBOX_ID_BD_COLOR_TYPE, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(0), + GADGET_ID_BD_COLOR_TYPE, GADGET_ID_NONE, -1, - options_levelset_save_mode, - &levelset_save_mode, - "Action:", NULL, NULL, "Select action when saving level set" + options_bd_color_type, + &level.bd_color_type, + "Boulder Dash level colors:", + "Color palette type:", NULL, "Select color palette type" + }, + { + ED_SELECTBOX_ID_BD_COLOR_C64_B, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(1), + GADGET_ID_BD_COLOR_C64_B, GADGET_ID_NONE, + -1, + options_bd_color_c64_name, + &bd_color_c64[0], + NULL, "Border color: ", NULL, "Select border color (not used)" + }, + { + ED_SELECTBOX_ID_BD_COLOR_C64_0, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(2), + GADGET_ID_BD_COLOR_C64_0, GADGET_ID_NONE, + -1, + options_bd_color_c64_name, + &bd_color_c64[1], + NULL, "Background color: ", NULL, "Select background color (C64 graphics)" + }, + { + ED_SELECTBOX_ID_BD_COLOR_C64_1, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(3), + GADGET_ID_BD_COLOR_C64_1, GADGET_ID_NONE, + -1, + options_bd_color_c64_name, + &bd_color_c64[2], + NULL, "Sand color: ", NULL, "Select sand color (C64 graphics)" + }, + { + ED_SELECTBOX_ID_BD_COLOR_C64_2, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(4), + GADGET_ID_BD_COLOR_C64_2, GADGET_ID_NONE, + -1, + options_bd_color_c64_name, + &bd_color_c64[3], + NULL, "Steel wall color: ", NULL, "Select steel wall color (C64 graphics)" + }, + { + ED_SELECTBOX_ID_BD_COLOR_C64_3, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(5), + GADGET_ID_BD_COLOR_C64_3, GADGET_ID_NONE, + -1, + options_bd_color_c64_name, + &bd_color_c64[4], + NULL, "Wall color: ", NULL, "Select wall color (C64 graphics)" + }, + { + ED_SELECTBOX_ID_BD_COLOR_C64_4, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(6), + GADGET_ID_BD_COLOR_C64_4, GADGET_ID_NONE, + -1, + options_bd_color_c64_name, + &bd_color_c64[5], + NULL, "Amoeba color: ", NULL, "Select amoeba color (C64 graphics)" + }, + { + ED_SELECTBOX_ID_BD_COLOR_C64_5, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(7), + GADGET_ID_BD_COLOR_C64_5, GADGET_ID_NONE, + -1, + options_bd_color_c64_name, + &bd_color_c64[6], + NULL, "Slime color: ", NULL, "Select slime color (C64 graphics)" }, // ---------- element settings: configure (several elements) ---------------- @@ -3286,7 +3518,7 @@ static struct -1, -1, GADGET_ID_ENGINECONFIG_COLORS, GADGET_ID_ENGINECONFIG_CONFIG, 8, "Colors", - NULL, NULL, NULL, "Configure game engine colors" + NULL, NULL, NULL, "Configure level colors" }, // ---------- element settings (tabs) --------------------------------------- @@ -3369,6 +3601,16 @@ static struct -1, "Delete", NULL, NULL, NULL, "Delete current change page" }, + + // ---------- engine settings (buttons) ------------------------------------- + + { + ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS, + ED_ENGINE_SETTINGS_XPOS(0), ED_ENGINE_SETTINGS_YPOS(8), + GADGET_ID_BD_SET_RANDOM_COLORS, GADGET_ID_NONE, + -1, "Set random colors", + NULL, NULL, NULL, "Create and set random level colors" + }, }; static struct @@ -4641,23 +4883,23 @@ static struct "Changes flying rocks to:", NULL, NULL, NULL, "Element to turn flying rocks to" }, - // ---------- BD amoeba content --------------------------------------------- + // ---------- BD amoeba 1 content ------------------------------------------- { - ED_DRAWING_ID_BD_AMOEBA_CONTENT_TOO_BIG, + ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_TOO_BIG, ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(7), ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, - GADGET_ID_BD_AMOEBA_CONTENT_TOO_BIG, GADGET_ID_NONE, - &level.bd_amoeba_content_too_big, 1, 1, - "If too big, changes to:", NULL, NULL, NULL, "BD amoeba content if too big" + GADGET_ID_BD_AMOEBA_1_CONTENT_TOO_BIG, GADGET_ID_NONE, + &level.bd_amoeba_1_content_too_big, 1, 1, + "If too big, changes to:", NULL, NULL, NULL, "Amoeba 1 content if too big" }, { - ED_DRAWING_ID_BD_AMOEBA_CONTENT_ENCLOSED, + ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_ENCLOSED, ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(8), ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, - GADGET_ID_BD_AMOEBA_CONTENT_ENCLOSED, GADGET_ID_NONE, - &level.bd_amoeba_content_enclosed, 1, 1, - "If enclosed, changes to:", NULL, NULL, NULL, "BD amoeba content if enclosed" + GADGET_ID_BD_AMOEBA_1_CONTENT_ENCLOSED, GADGET_ID_NONE, + &level.bd_amoeba_1_content_enclosed, 1, 1, + "If enclosed, changes to:", NULL, NULL, NULL, "Amoeba 1 content if enclosed" }, // ---------- BD amoeba 2 content ------------------------------------------- @@ -4668,7 +4910,7 @@ static struct ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_BD_AMOEBA_2_CONTENT_TOO_BIG, GADGET_ID_NONE, &level.bd_amoeba_2_content_too_big, 1, 1, - "If too big, changes to:", NULL, NULL, NULL, "BD amoeba 2 content if too big" + "If too big, changes to:", NULL, NULL, NULL, "Amoeba 2 content if too big" }, { ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_ENCLOSED, @@ -4676,7 +4918,7 @@ static struct ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_BD_AMOEBA_2_CONTENT_ENCLOSED, GADGET_ID_NONE, &level.bd_amoeba_2_content_enclosed, 1, 1, - "If enclosed, changes to:", NULL, NULL, NULL, "BD amoeba 2 content if enclosed" + "If enclosed, changes to:", NULL, NULL, NULL, "Amoeba 2 content if enclosed" }, { ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_EXPLODING, @@ -4684,7 +4926,7 @@ static struct ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_BD_AMOEBA_2_CONTENT_EXPLODING, GADGET_ID_NONE, &level.bd_amoeba_2_content_exploding, 1, 1, - "If exploding, changes to:", NULL, NULL, NULL, "BD amoeba 2 content if exploding" + "If exploding, changes to:", NULL, NULL, NULL, "Amoeba 2 content if exploding" }, { ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE, @@ -4692,7 +4934,7 @@ static struct ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE, GADGET_ID_NONE, &level.bd_amoeba_2_content_looks_like, 1, 1, - "Use graphic of element:", NULL, NULL, NULL, "BD amoeba 2 looks like this element" + "Use graphic of element:", NULL, NULL, NULL, "Amoeba 2 looks like this element" }, { ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_1, @@ -4831,11 +5073,11 @@ static struct "Turns to on impact:", NULL, NULL, NULL, "Changes to this when falling stops" }, { - ED_DRAWING_ID_BD_FIREFLY_EXPLODES_TO, + ED_DRAWING_ID_BD_FIREFLY_1_EXPLODES_TO, ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(0), ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, - GADGET_ID_BD_FIREFLY_EXPLODES_TO, GADGET_ID_NONE, - &level.bd_firefly_explodes_to, 1, 1, + GADGET_ID_BD_FIREFLY_1_EXPLODES_TO, GADGET_ID_NONE, + &level.bd_firefly_1_explodes_to, 1, 1, "Explodes to:", NULL, NULL, NULL, "Changes to this when exploding" }, { @@ -4847,11 +5089,11 @@ static struct "Explodes to:", NULL, NULL, NULL, "Changes to this when exploding" }, { - ED_DRAWING_ID_BD_BUTTERFLY_EXPLODES_TO, + ED_DRAWING_ID_BD_BUTTERFLY_1_EXPLODES_TO, ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(0), ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, - GADGET_ID_BD_BUTTERFLY_EXPLODES_TO, GADGET_ID_NONE, - &level.bd_butterfly_explodes_to, 1, 1, + GADGET_ID_BD_BUTTERFLY_1_EXPLODES_TO, GADGET_ID_NONE, + &level.bd_butterfly_1_explodes_to, 1, 1, "Explodes to:", NULL, NULL, NULL, "Changes to this when exploding" }, { @@ -5157,7 +5399,6 @@ static boolean getDrawModeHiRes(void); static int getTabulatorBarWidth(void); static int getTabulatorBarHeight(void); static Pixel getTabulatorBarColor(void); -static void getEditorGraphicAndFrame(int, int *, int *, boolean); static int numHiresTiles(int); static int num_editor_gadgets = 0; // dynamically determined @@ -5236,7 +5477,7 @@ static int num_editor_el_boulderdash = ARRAY_SIZE(editor_el_boulderdash); static int editor_hl_boulderdash_native[] = { - EL_INTERNAL_CASCADE_BD_NATIVE_ACTIVE, + EL_INTERNAL_CASCADE_BDX_ACTIVE, EL_CHAR('B'), EL_CHAR('D'), EL_EMPTY, @@ -5245,167 +5486,167 @@ static int editor_hl_boulderdash_native[] = static int editor_el_boulderdash_native[] = { EL_EMPTY, - EL_BD_SAND, - EL_BD_ROCK, - EL_BD_DIAMOND, - - EL_BD_INBOX, - EL_BD_STEELWALL, - EL_BD_WALL, - EL_BD_MAGIC_WALL, - - EL_BD_AMOEBA, - EL_BD_BUTTERFLY_UP, - EL_BD_FIREFLY_UP, - EL_BD_EXIT_CLOSED, - - EL_BD_BUTTERFLY_LEFT, - EL_BD_FIREFLY_LEFT, - EL_BD_BUTTERFLY_RIGHT, - EL_BD_FIREFLY_RIGHT, - - EL_BD_SAND_2, - EL_BD_BUTTERFLY_DOWN, - EL_BD_FIREFLY_DOWN, - EL_BD_EXIT_OPEN, - - EL_BD_AMOEBA_2, - EL_BD_BUTTERFLY_2_UP, - EL_BD_FIREFLY_2_UP, - EL_BD_SLIME, - - EL_BD_BUTTERFLY_2_LEFT, - EL_BD_FIREFLY_2_LEFT, - EL_BD_BUTTERFLY_2_RIGHT, - EL_BD_FIREFLY_2_RIGHT, - - EL_BD_BOMB, - EL_BD_BUTTERFLY_2_DOWN, - EL_BD_FIREFLY_2_DOWN, - EL_BD_FLYING_DIAMOND, - - EL_BD_NITRO_PACK, - EL_BD_DRAGONFLY_UP, - EL_BD_STONEFLY_UP, - EL_BD_DIAMOND_GLUED, - - EL_BD_DRAGONFLY_LEFT, - EL_BD_STONEFLY_LEFT, - EL_BD_DRAGONFLY_RIGHT, - EL_BD_STONEFLY_RIGHT, - - EL_BD_NUT, - EL_BD_DRAGONFLY_DOWN, - EL_BD_STONEFLY_DOWN, + EL_BDX_SAND_1, + EL_BDX_ROCK, + EL_BDX_DIAMOND, + + EL_BDX_INBOX, + EL_BDX_STEELWALL, + EL_BDX_WALL, + EL_BDX_MAGIC_WALL, + + EL_BDX_AMOEBA_1, + EL_BDX_BUTTERFLY_1_UP, + EL_BDX_FIREFLY_1_UP, + EL_BDX_EXIT_CLOSED, + + EL_BDX_BUTTERFLY_1_LEFT, + EL_BDX_FIREFLY_1_LEFT, + EL_BDX_BUTTERFLY_1_RIGHT, + EL_BDX_FIREFLY_1_RIGHT, + + EL_BDX_SAND_2, + EL_BDX_BUTTERFLY_1_DOWN, + EL_BDX_FIREFLY_1_DOWN, + EL_BDX_EXIT_OPEN, + + EL_BDX_AMOEBA_2, + EL_BDX_BUTTERFLY_2_UP, + EL_BDX_FIREFLY_2_UP, + EL_BDX_SLIME, + + EL_BDX_BUTTERFLY_2_LEFT, + EL_BDX_FIREFLY_2_LEFT, + EL_BDX_BUTTERFLY_2_RIGHT, + EL_BDX_FIREFLY_2_RIGHT, + + EL_BDX_BOMB, + EL_BDX_BUTTERFLY_2_DOWN, + EL_BDX_FIREFLY_2_DOWN, + EL_BDX_FLYING_DIAMOND, + + EL_BDX_NITRO_PACK, + EL_BDX_DRAGONFLY_UP, + EL_BDX_STONEFLY_UP, + EL_BDX_DIAMOND_GLUED, + + EL_BDX_DRAGONFLY_LEFT, + EL_BDX_STONEFLY_LEFT, + EL_BDX_DRAGONFLY_RIGHT, + EL_BDX_STONEFLY_RIGHT, + + EL_BDX_NUT, + EL_BDX_DRAGONFLY_DOWN, + EL_BDX_STONEFLY_DOWN, EL_EMPTY, - EL_BD_BITER_SWITCH_1, - EL_BD_BITER_UP, - EL_BD_COW_UP, + EL_BDX_BITER_SWITCH_1, + EL_BDX_BITER_UP, + EL_BDX_COW_UP, EL_EMPTY, - EL_BD_BITER_LEFT, - EL_BD_COW_LEFT, - EL_BD_BITER_RIGHT, - EL_BD_COW_RIGHT, - - EL_BD_VOODOO_DOLL, - EL_BD_BITER_DOWN, - EL_BD_COW_DOWN, - EL_BD_GHOST, - - EL_BD_SAND_GLUED, - EL_BD_SAND_BALL, - EL_BD_SAND_LOOSE, - EL_BD_WALL_NON_SLOPED, - - EL_BD_SAND_SLOPED_UP_LEFT, - EL_BD_SAND_SLOPED_UP_RIGHT, - EL_BD_WALL_SLOPED_UP_LEFT, - EL_BD_WALL_SLOPED_UP_RIGHT, - - EL_BD_SAND_SLOPED_DOWN_LEFT, - EL_BD_SAND_SLOPED_DOWN_RIGHT, - EL_BD_WALL_SLOPED_DOWN_LEFT, - EL_BD_WALL_SLOPED_DOWN_RIGHT, - - EL_BD_FLYING_ROCK, - EL_BD_ROCK_GLUED, - EL_BD_STEELWALL_SLOPED_UP_LEFT, - EL_BD_STEELWALL_SLOPED_UP_RIGHT, - - EL_BD_WAITING_ROCK, - EL_BD_CHASING_ROCK, - EL_BD_STEELWALL_SLOPED_DOWN_LEFT, - EL_BD_STEELWALL_SLOPED_DOWN_RIGHT, - - EL_BD_MEGA_ROCK, - EL_BD_SWEET, - EL_BD_INVISIBLE_EXIT_CLOSED, - EL_BD_INVISIBLE_EXIT_OPEN, - - EL_BD_STEELWALL_EXPLODABLE, - EL_BD_STEELWALL_DIGGABLE, - EL_BD_WALL_DIGGABLE, - EL_BD_FALLING_WALL, - - EL_BD_EXPANDABLE_WALL_HORIZONTAL, - EL_BD_EXPANDABLE_WALL_VERTICAL, - EL_BD_EXPANDABLE_WALL_ANY, - EL_BD_EXPANDABLE_WALL_SWITCH, - - EL_BD_EXPANDABLE_STEELWALL_HORIZONTAL, - EL_BD_EXPANDABLE_STEELWALL_VERTICAL, - EL_BD_EXPANDABLE_STEELWALL_ANY, - EL_BD_CREATURE_SWITCH, - - EL_BD_BLADDER, - EL_BD_BLADDER_SPENDER, - EL_BD_REPLICATOR, - EL_BD_REPLICATOR_SWITCH, - - EL_BD_CONVEYOR_LEFT, - EL_BD_CONVEYOR_RIGHT, - EL_BD_CONVEYOR_SWITCH, - EL_BD_CONVEYOR_DIR_SWITCH, - - EL_BD_CLOCK, - EL_BD_TIME_PENALTY, - EL_BD_GRAVESTONE, - EL_BD_SKELETON, - - EL_BD_WATER, - EL_BD_ACID, - EL_BD_LAVA, - EL_BD_BOX, - - EL_BD_GATE_1, - EL_BD_GATE_2, - EL_BD_GATE_3, - EL_BD_TRAPPED_DIAMOND, - - EL_BD_KEY_1, - EL_BD_KEY_2, - EL_BD_KEY_3, - EL_BD_DIAMOND_KEY, - - EL_BD_WALL_KEY_1, - EL_BD_WALL_KEY_2, - EL_BD_WALL_KEY_3, - EL_BD_WALL_DIAMOND, - - EL_BD_POT, - EL_BD_GRAVITY_SWITCH, - EL_BD_PNEUMATIC_HAMMER, - EL_BD_TELEPORTER, - - EL_BD_PLAYER, - EL_BD_PLAYER_WITH_BOMB, - EL_BD_PLAYER_WITH_ROCKET_LAUNCHER, - EL_BD_ROCKET_LAUNCHER, - - EL_BD_PLAYER_GLUED, - EL_BD_PLAYER_STIRRING, + EL_BDX_BITER_LEFT, + EL_BDX_COW_LEFT, + EL_BDX_BITER_RIGHT, + EL_BDX_COW_RIGHT, + + EL_BDX_VOODOO_DOLL, + EL_BDX_BITER_DOWN, + EL_BDX_COW_DOWN, + EL_BDX_GHOST, + + EL_BDX_SAND_GLUED, + EL_BDX_SAND_BALL, + EL_BDX_SAND_LOOSE, + EL_BDX_WALL_NON_SLOPED, + + EL_BDX_SAND_SLOPED_UP_LEFT, + EL_BDX_SAND_SLOPED_UP_RIGHT, + EL_BDX_WALL_SLOPED_UP_LEFT, + EL_BDX_WALL_SLOPED_UP_RIGHT, + + EL_BDX_SAND_SLOPED_DOWN_LEFT, + EL_BDX_SAND_SLOPED_DOWN_RIGHT, + EL_BDX_WALL_SLOPED_DOWN_LEFT, + EL_BDX_WALL_SLOPED_DOWN_RIGHT, + + EL_BDX_FLYING_ROCK, + EL_BDX_ROCK_GLUED, + EL_BDX_STEELWALL_SLOPED_UP_LEFT, + EL_BDX_STEELWALL_SLOPED_UP_RIGHT, + + EL_BDX_WAITING_ROCK, + EL_BDX_CHASING_ROCK, + EL_BDX_STEELWALL_SLOPED_DOWN_LEFT, + EL_BDX_STEELWALL_SLOPED_DOWN_RIGHT, + + EL_BDX_MEGA_ROCK, + EL_BDX_SWEET, + EL_BDX_INVISIBLE_EXIT_CLOSED, + EL_BDX_INVISIBLE_EXIT_OPEN, + + EL_BDX_STEELWALL_EXPLODABLE, + EL_BDX_STEELWALL_DIGGABLE, + EL_BDX_WALL_DIGGABLE, + EL_BDX_FALLING_WALL, + + EL_BDX_EXPANDABLE_WALL_HORIZONTAL, + EL_BDX_EXPANDABLE_WALL_VERTICAL, + EL_BDX_EXPANDABLE_WALL_ANY, + EL_BDX_EXPANDABLE_WALL_SWITCH, + + EL_BDX_EXPANDABLE_STEELWALL_HORIZONTAL, + EL_BDX_EXPANDABLE_STEELWALL_VERTICAL, + EL_BDX_EXPANDABLE_STEELWALL_ANY, + EL_BDX_CREATURE_SWITCH, + + EL_BDX_BLADDER, + EL_BDX_BLADDER_SPENDER, + EL_BDX_REPLICATOR, + EL_BDX_REPLICATOR_SWITCH, + + EL_BDX_CONVEYOR_LEFT, + EL_BDX_CONVEYOR_RIGHT, + EL_BDX_CONVEYOR_SWITCH, + EL_BDX_CONVEYOR_DIR_SWITCH, + + EL_BDX_CLOCK, + EL_BDX_TIME_PENALTY, + EL_BDX_GRAVESTONE, + EL_BDX_SKELETON, + + EL_BDX_WATER, + EL_BDX_ACID, + EL_BDX_LAVA, + EL_BDX_BOX, + + EL_BDX_GATE_1, + EL_BDX_GATE_2, + EL_BDX_GATE_3, + EL_BDX_TRAPPED_DIAMOND, + + EL_BDX_KEY_1, + EL_BDX_KEY_2, + EL_BDX_KEY_3, + EL_BDX_DIAMOND_KEY, + + EL_BDX_WALL_KEY_1, + EL_BDX_WALL_KEY_2, + EL_BDX_WALL_KEY_3, + EL_BDX_WALL_DIAMOND, + + EL_BDX_POT, + EL_BDX_GRAVITY_SWITCH, + EL_BDX_PNEUMATIC_HAMMER, + EL_BDX_TELEPORTER, + + EL_BDX_PLAYER, + EL_BDX_PLAYER_WITH_BOMB, + EL_BDX_PLAYER_WITH_ROCKET_LAUNCHER, + EL_BDX_ROCKET_LAUNCHER, + + EL_BDX_PLAYER_GLUED, + EL_BDX_PLAYER_STIRRING, EL_EMPTY, EL_EMPTY, }; @@ -5416,7 +5657,7 @@ static int num_editor_el_boulderdash_native = ARRAY_SIZE(editor_el_boulderdash_n static int editor_hl_boulderdash_effects[] = { - EL_INTERNAL_CASCADE_BD_EFFECTS_ACTIVE, + EL_INTERNAL_CASCADE_BDX_EFFECTS_ACTIVE, EL_CHAR('B'), EL_CHAR('D'), EL_CHAR('E'), @@ -5424,125 +5665,125 @@ static int editor_hl_boulderdash_effects[] = static int editor_el_boulderdash_effects[] = { - EL_BD_DIAMOND_FALLING, - EL_BD_ROCK_FALLING, - EL_BD_MEGA_ROCK_FALLING, - EL_BD_FLYING_DIAMOND_FLYING, - - EL_BD_FALLING_WALL_FALLING, - EL_BD_NITRO_PACK_FALLING, - EL_BD_NUT_FALLING, - EL_BD_FLYING_ROCK_FLYING, - - EL_BD_PLAYER_GROWING_1, - EL_BD_PLAYER_GROWING_2, - EL_BD_PLAYER_GROWING_3, - EL_BD_PLAYER, - - EL_BD_PLAYER_WITH_BOMB, - EL_BD_PLAYER_STIRRING, - EL_BD_EXIT_OPEN, - EL_BD_INVISIBLE_EXIT_OPEN, - - EL_BD_BLADDER_1, - EL_BD_BLADDER_2, - EL_BD_BLADDER_3, - EL_BD_BLADDER_4, - - EL_BD_BLADDER_5, - EL_BD_BLADDER_6, - EL_BD_BLADDER_7, - EL_BD_BLADDER_8, - - EL_BD_SAND_2, - EL_BD_COW_ENCLOSED_1, - EL_BD_COW_ENCLOSED_2, - EL_BD_COW_ENCLOSED_3, - - EL_BD_COW_ENCLOSED_4, - EL_BD_COW_ENCLOSED_5, - EL_BD_COW_ENCLOSED_6, - EL_BD_COW_ENCLOSED_7, - - EL_BD_WATER_1, - EL_BD_WATER_2, - EL_BD_WATER_3, - EL_BD_WATER_4, - - EL_BD_WATER_5, - EL_BD_WATER_6, - EL_BD_WATER_7, - EL_BD_WATER_8, - - EL_BD_WATER_9, - EL_BD_WATER_10, - EL_BD_WATER_11, - EL_BD_WATER_12, - - EL_BD_WATER_13, - EL_BD_WATER_14, - EL_BD_WATER_15, - EL_BD_WATER_16, - - EL_BD_BOMB_TICKING_1, - EL_BD_BOMB_TICKING_2, - EL_BD_BOMB_TICKING_3, - EL_BD_BOMB_TICKING_4, - - EL_BD_BOMB_TICKING_5, - EL_BD_BOMB_TICKING_6, - EL_BD_BOMB_TICKING_7, + EL_BDX_DIAMOND_FALLING, + EL_BDX_ROCK_FALLING, + EL_BDX_MEGA_ROCK_FALLING, + EL_BDX_FLYING_DIAMOND_FLYING, + + EL_BDX_FALLING_WALL_FALLING, + EL_BDX_NITRO_PACK_FALLING, + EL_BDX_NUT_FALLING, + EL_BDX_FLYING_ROCK_FLYING, + + EL_BDX_PLAYER_GROWING_1, + EL_BDX_PLAYER_GROWING_2, + EL_BDX_PLAYER_GROWING_3, + EL_BDX_PLAYER, + + EL_BDX_PLAYER_WITH_BOMB, + EL_BDX_PLAYER_STIRRING, + EL_BDX_EXIT_OPEN, + EL_BDX_INVISIBLE_EXIT_OPEN, + + EL_BDX_BLADDER_1, + EL_BDX_BLADDER_2, + EL_BDX_BLADDER_3, + EL_BDX_BLADDER_4, + + EL_BDX_BLADDER_5, + EL_BDX_BLADDER_6, + EL_BDX_BLADDER_7, + EL_BDX_BLADDER_8, + + EL_BDX_SAND_2, + EL_BDX_COW_ENCLOSED_1, + EL_BDX_COW_ENCLOSED_2, + EL_BDX_COW_ENCLOSED_3, + + EL_BDX_COW_ENCLOSED_4, + EL_BDX_COW_ENCLOSED_5, + EL_BDX_COW_ENCLOSED_6, + EL_BDX_COW_ENCLOSED_7, + + EL_BDX_WATER_1, + EL_BDX_WATER_2, + EL_BDX_WATER_3, + EL_BDX_WATER_4, + + EL_BDX_WATER_5, + EL_BDX_WATER_6, + EL_BDX_WATER_7, + EL_BDX_WATER_8, + + EL_BDX_WATER_9, + EL_BDX_WATER_10, + EL_BDX_WATER_11, + EL_BDX_WATER_12, + + EL_BDX_WATER_13, + EL_BDX_WATER_14, + EL_BDX_WATER_15, + EL_BDX_WATER_16, + + EL_BDX_BOMB_TICKING_1, + EL_BDX_BOMB_TICKING_2, + EL_BDX_BOMB_TICKING_3, + EL_BDX_BOMB_TICKING_4, + + EL_BDX_BOMB_TICKING_5, + EL_BDX_BOMB_TICKING_6, + EL_BDX_BOMB_TICKING_7, EL_EMPTY, - EL_BD_BOMB_EXPLODING_1, - EL_BD_BOMB_EXPLODING_2, - EL_BD_BOMB_EXPLODING_3, - EL_BD_BOMB_EXPLODING_4, - - EL_BD_NUT_BREAKING_1, - EL_BD_NUT_BREAKING_2, - EL_BD_NUT_BREAKING_3, - EL_BD_NUT_BREAKING_4, - - EL_BD_EXPLODING_1, - EL_BD_EXPLODING_2, - EL_BD_EXPLODING_3, - EL_BD_EXPLODING_4, - - EL_BD_EXPLODING_5, - EL_BD_TIME_PENALTY, - EL_BD_DIAMOND_GROWING_1, - EL_BD_DIAMOND_GROWING_2, - - EL_BD_DIAMOND_GROWING_3, - EL_BD_DIAMOND_GROWING_4, - EL_BD_DIAMOND_GROWING_5, - EL_BD_NITRO_PACK_EXPLODING, - - EL_BD_NITRO_PACK_EXPLODING_1, - EL_BD_NITRO_PACK_EXPLODING_2, - EL_BD_NITRO_PACK_EXPLODING_3, - EL_BD_NITRO_PACK_EXPLODING_4, - - EL_BD_ROCK_GROWING_1, - EL_BD_ROCK_GROWING_2, - EL_BD_ROCK_GROWING_3, - EL_BD_ROCK_GROWING_4, - - EL_BD_STEELWALL_GROWING_1, - EL_BD_STEELWALL_GROWING_2, - EL_BD_STEELWALL_GROWING_3, - EL_BD_STEELWALL_GROWING_4, - - EL_BD_CLOCK_GROWING_1, - EL_BD_CLOCK_GROWING_2, - EL_BD_CLOCK_GROWING_3, - EL_BD_CLOCK_GROWING_4, - - EL_BD_GHOST_EXPLODING_1, - EL_BD_GHOST_EXPLODING_2, - EL_BD_GHOST_EXPLODING_3, - EL_BD_GHOST_EXPLODING_4, + EL_BDX_BOMB_EXPLODING_1, + EL_BDX_BOMB_EXPLODING_2, + EL_BDX_BOMB_EXPLODING_3, + EL_BDX_BOMB_EXPLODING_4, + + EL_BDX_NUT_BREAKING_1, + EL_BDX_NUT_BREAKING_2, + EL_BDX_NUT_BREAKING_3, + EL_BDX_NUT_BREAKING_4, + + EL_BDX_EXPLODING_1, + EL_BDX_EXPLODING_2, + EL_BDX_EXPLODING_3, + EL_BDX_EXPLODING_4, + + EL_BDX_EXPLODING_5, + EL_BDX_TIME_PENALTY, + EL_BDX_DIAMOND_GROWING_1, + EL_BDX_DIAMOND_GROWING_2, + + EL_BDX_DIAMOND_GROWING_3, + EL_BDX_DIAMOND_GROWING_4, + EL_BDX_DIAMOND_GROWING_5, + EL_BDX_NITRO_PACK_EXPLODING, + + EL_BDX_NITRO_PACK_EXPLODING_1, + EL_BDX_NITRO_PACK_EXPLODING_2, + EL_BDX_NITRO_PACK_EXPLODING_3, + EL_BDX_NITRO_PACK_EXPLODING_4, + + EL_BDX_ROCK_GROWING_1, + EL_BDX_ROCK_GROWING_2, + EL_BDX_ROCK_GROWING_3, + EL_BDX_ROCK_GROWING_4, + + EL_BDX_STEELWALL_GROWING_1, + EL_BDX_STEELWALL_GROWING_2, + EL_BDX_STEELWALL_GROWING_3, + EL_BDX_STEELWALL_GROWING_4, + + EL_BDX_CLOCK_GROWING_1, + EL_BDX_CLOCK_GROWING_2, + EL_BDX_CLOCK_GROWING_3, + EL_BDX_CLOCK_GROWING_4, + + EL_BDX_GHOST_EXPLODING_1, + EL_BDX_GHOST_EXPLODING_2, + EL_BDX_GHOST_EXPLODING_3, + EL_BDX_GHOST_EXPLODING_4, }; static int *editor_hl_boulderdash_effects_ptr = editor_hl_boulderdash_effects; static int *editor_el_boulderdash_effects_ptr = editor_el_boulderdash_effects; @@ -7009,13 +7250,13 @@ editor_elements_info[] = }, { &setup_editor_el_boulderdash_native, - &setup.editor_cascade.el_bd_native, + &setup.editor_cascade.el_bdx, &editor_hl_boulderdash_native_ptr, &num_editor_hl_boulderdash_native, &editor_el_boulderdash_native_ptr, &num_editor_el_boulderdash_native }, { &setup_editor_el_boulderdash_effects, - &setup.editor_cascade.el_bd_effects, + &setup.editor_cascade.el_bdx_effects, &editor_hl_boulderdash_effects_ptr, &num_editor_hl_boulderdash_effects, &editor_el_boulderdash_effects_ptr, &num_editor_el_boulderdash_effects }, @@ -7815,7 +8056,7 @@ static void DrawDrawingArea(int id) int graphic; int frame; - getEditorGraphicAndFrame(element, &graphic, &frame, TRUE); + el2edimg_with_frame(element, &graphic, &frame); DrawSizedGraphicExt(drawto, gi->x + x * tilesize, @@ -7856,45 +8097,13 @@ static void ScrollEditorLevel(int from_x, int from_y, int scroll) BackToFront(); } -static void getEditorGraphicAndFrame(int element, int *graphic, int *frame, boolean use_editor_gfx) -{ - if (use_editor_gfx) - { - *graphic = el2edimg(element); - *frame = 0; - } - else - { - *graphic = el2img(element); - *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); - } - - if (*graphic == IMG_UNKNOWN) - { - // no graphic defined -- if BD style, try to get runtime ("effect") element graphics - // (normal BD style elements have graphics, but runtime ("effects") elements do not) - int element_bd = map_element_RND_to_BD_cave(element); - - if (element_bd != O_UNKNOWN) - { - struct GraphicInfo_BD *g_bd = &graphic_info_bd_object[element_bd][0]; - - *graphic = g_bd->graphic; - *frame = g_bd->frame; - } - } -} - static void getEditorGraphicSource(int element, int tile_size, Bitmap **bitmap, int *x, int *y) { int graphic; int frame; - getEditorGraphicAndFrame(element, &graphic, &frame, TRUE); + el2edimg_with_frame(element, &graphic, &frame); getSizedGraphicSource(graphic, frame, tile_size, bitmap, x, y); } @@ -8414,7 +8623,11 @@ static void CreateTextInputGadgets(void) y = ED_SETTINGS_Y(textinput_info[i].y); } - sprintf(infotext, "Enter %s", textinput_info[i].infotext); + // determine horizontal offset for leading text + if (textinput_info[i].text_left != NULL) + x += getTextWidthForGadget(textinput_info[i].text_left); + + sprintf(infotext, "%s", textinput_info[i].infotext); infotext[max_infotext_len] = '\0'; gi = CreateGadget(GDI_CUSTOM_ID, id, @@ -9165,12 +9378,23 @@ static void MapTextInputGadget(int id) int font_nr = FONT_TEXT_1; int font_height = getFontHeight(font_nr); struct GadgetInfo *gi = level_editor_gadget[textinput_info[id].gadget_id]; + int xoffset_left = getTextWidthForGadget(textinput_info[id].text_left); + int xoffset_right = ED_GADGET_TEXT_DISTANCE; int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE; - int x_above = ED_SETTINGS_X(textinput_info[id].x); - int y_above = ED_SETTINGS_Y(textinput_info[id].y) - yoffset_above; + int yoffset = (gi->height - font_height) / 2; + int x_left = gi->x - xoffset_left; + int x_right = gi->x + gi->width + xoffset_right; + int y_above = gi->y - yoffset_above; + int y = gi->y + yoffset; if (textinput_info[id].text_above) - DrawTextS(x_above, y_above, font_nr, textinput_info[id].text_above); + DrawText(x_left, y_above, textinput_info[id].text_above, font_nr); + + if (textinput_info[id].text_left) + DrawText(x_left, y, textinput_info[id].text_left, font_nr); + + if (textinput_info[id].text_right) + DrawText(x_right, y, textinput_info[id].text_right, font_nr); ModifyGadget(gi, GDI_TEXT_VALUE, textinput_info[id].value, GDI_END); @@ -9210,11 +9434,10 @@ static void MapSelectboxGadget(int id) int x_left = gi->x - xoffset_left; int x_right = gi->x + gi->width + xoffset_right; int y_above = gi->y - yoffset_above; - int x = gi->x; int y = gi->y + yoffset; if (selectbox_info[id].text_above) - DrawText(x, y_above, selectbox_info[id].text_above, font_nr); + DrawText(x_left, y_above, selectbox_info[id].text_above, font_nr); if (selectbox_info[id].text_left) DrawText(x_left, y, selectbox_info[id].text_left, font_nr); @@ -10346,30 +10569,10 @@ static void InitDrawingElements(void) if (level.game_engine_type == game_engine_type_last) return; - if (level.game_engine_type == GAME_ENGINE_TYPE_BD) - { - new_element1 = EL_BD_WALL; - new_element2 = EL_EMPTY; - new_element3 = EL_BD_SAND; - } - else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) - { - new_element1 = EL_SP_CHIP_SINGLE; - new_element2 = EL_EMPTY; - new_element3 = EL_SP_BASE; - } - else if (level.game_engine_type == GAME_ENGINE_TYPE_MM) - { - new_element1 = EL_MM_MIRROR_START; - new_element2 = EL_EMPTY; - new_element3 = EL_MM_WOODEN_WALL; - } - else - { - new_element1 = EL_WALL; - new_element2 = EL_EMPTY; - new_element3 = EL_SAND; - } + // select drawing elements according to game engine type + new_element1 = getDrawingElement(EL_WALL); + new_element2 = getDrawingElement(EL_EMPTY); + new_element3 = getDrawingElement(EL_SAND); game_engine_type_last = level.game_engine_type; } @@ -11168,9 +11371,135 @@ static void DrawEngineConfigConfig(void) MapSelectboxGadget(i); } +static int GetCommonColorType_BD(void) +{ + int bd_color_type = *bd_color[0] >> 24; + int i; + + // check if all colors have the same color type + for (i = 1; i < MAX_BD_COLORS; i++) + if ((*bd_color[i] >> 24) != bd_color_type) + return GD_COLOR_TYPE_RGB; + + return bd_color_type; +} + +void SetDefaultLevelColorType_BD(void) +{ + bd_color_type_default = GetCommonColorType_BD(); + + level.bd_color_type = bd_color_type_default; +} + +void SetDefaultLevelColors_BD(void) +{ + int i; + + for (i = 0; i < MAX_BD_COLORS; i++) + bd_color_default[i] = *bd_color[i]; +} + +void SetRandomLevelColors_BD(int bd_color_type) +{ + struct LevelInfo_BD *level_bd = level.native_bd_level; + GdCave *cave = level_bd->cave; + + // create random cave colors + gd_cave_set_random_colors(cave, bd_color_type); + + // copy colors to level editor + level.bd_color_b = cave->colorb; + level.bd_color_0 = cave->color0; + level.bd_color_1 = cave->color1; + level.bd_color_2 = cave->color2; + level.bd_color_3 = cave->color3; + level.bd_color_4 = cave->color4; + level.bd_color_5 = cave->color5; +} + +static void DrawColorBox_BD(int nr) +{ + int id = ED_SELECTBOX_ID_COLORS_FIRST + nr; + struct GadgetInfo *gi = level_editor_gadget[selectbox_info[id].gadget_id]; + int graphic = IMG_EDITOR_CHECKBOX; + struct GraphicInfo *gd = &graphic_info[graphic]; + int offset = ED_GADGET_TEXT_DISTANCE; + int x1 = gi->x - offset - gd->width; + int y1 = gi->y; + int x2 = x1 + offset; + int y2 = y1 + offset; + int xsize1 = gd->width; + int ysize1 = gd->height; + int xsize2 = xsize1 - 2 * offset; + int ysize2 = ysize1 - 2 * offset; + int bd_color_x = *bd_color[nr]; + int r = gd_color_get_r(bd_color_x); + int g = gd_color_get_g(bd_color_x); + int b = gd_color_get_b(bd_color_x); + Pixel color = SDL_MapRGB(drawto->surface->format, r, g, b); + + BlitBitmap(gd->bitmap, drawto, gd->src_x, gd->src_y, xsize1, ysize1, x1, y1); + FillRectangle(drawto, x2, y2, xsize2, ysize2, color); +} + static void DrawEngineConfigColors(void) { - // (no settings yet) + int i; + + if (bd_color_type_changed) + { + if (level.bd_color_type != GD_COLOR_TYPE_RGB && level.bd_color_type != GetCommonColorType_BD()) + { + // color type switched to non-RGB colors, but using different color type => reset colors + + if (level.bd_color_type == bd_color_type_default) + { + // color type switched to same color type as default colors => reset to defaults + for (i = 0; i < MAX_BD_COLORS; i++) + *bd_color[i] = bd_color_default[i]; + } + else + { + // color type switched to different color type as default colors => use random colors + SetRandomLevelColors_BD(level.bd_color_type); + } + } + + bd_color_type_changed = FALSE; + } + + // copy level colors to either C64-style color index or color text + for (i = 0; i < MAX_BD_COLORS; i++) + { + int bd_color_x = (level.bd_color_type == GD_COLOR_TYPE_C64 ? *bd_color[i] & 0x0f : + level.bd_color_type == GD_COLOR_TYPE_RGB ? gd_color_get_rgb(*bd_color[i]) : + *bd_color[i]); + + if (level.bd_color_type == GD_COLOR_TYPE_C64) + bd_color_c64[i] = bd_color_x; + else + snprintf(bd_color_text[i], sizeof(bd_color_text[i]), "%s", gd_color_get_string(bd_color_x)); + } + + MapSelectboxGadget(ED_SELECTBOX_ID_BD_COLOR_TYPE); + + if (level.bd_color_type == GD_COLOR_TYPE_C64) + { + // draw selectbox gadgets + for (i = ED_SELECTBOX_ID_COLORS_FIRST; i <= ED_SELECTBOX_ID_COLORS_LAST; i++) + MapSelectboxGadget(i); + } + else + { + // draw text input gadgets + for (i = ED_TEXTINPUT_ID_COLORS_FIRST; i <= ED_TEXTINPUT_ID_COLORS_LAST; i++) + MapTextInputGadget(i); + } + + for (i = 0; i < MAX_BD_COLORS; i++) + DrawColorBox_BD(i); + + MapTextbuttonGadget(ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS); } static void DrawLevelConfigEngine(void) @@ -11191,6 +11520,11 @@ static void DrawLevelConfigWindow(void) stick_element_properties_window = FALSE; + // make sure that previous level config edit mode exists for this level + if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_ENGINE && + level.game_engine_type != GAME_ENGINE_TYPE_BD) + edit_mode_levelconfig = ED_MODE_LEVELCONFIG_LEVEL; + SetAutomaticNumberOfGemsNeeded(); UnmapLevelEditorFieldGadgets(); @@ -11616,33 +11950,38 @@ static void DrawPropertiesInfo(void) ypos += 2 * MAX(font1_height, font2_height); - // ----- print standard properties of this element + // ----- print standard properties of this element (only for certain game engines) - DrawTextS(xpos, ypos, font1_nr, properties_text); + if (level.game_engine_type == GAME_ENGINE_TYPE_RND || + level.game_engine_type == GAME_ENGINE_TYPE_EM || + level.game_engine_type == GAME_ENGINE_TYPE_SP) + { + DrawTextS(xpos, ypos, font1_nr, properties_text); - ypos += line1_height; + ypos += line1_height; - for (i = 0; properties[i].value != -1; i++) - { - if (!HAS_PROPERTY(properties_element, properties[i].value)) - continue; + for (i = 0; properties[i].value != -1; i++) + { + if (!HAS_PROPERTY(properties_element, properties[i].value)) + continue; - DrawTextS(xpos, ypos, font2_nr, properties[i].text); + DrawTextS(xpos, ypos, font2_nr, properties[i].text); - ypos += font2_height; + ypos += font2_height; - num_standard_properties++; - } + num_standard_properties++; + } - if (num_standard_properties == 0) - { - DrawTextS(xpos + properties_text_len, ypos - line1_height + font2_yoffset, - font2_nr, none_text); + if (num_standard_properties == 0) + { + DrawTextS(xpos + properties_text_len, ypos - line1_height + font2_yoffset, + font2_nr, none_text); - ypos -= (line1_height - font1_height); - } + ypos -= (line1_height - font1_height); + } - ypos += MAX(font1_height, font2_height); + ypos += MAX(font1_height, font2_height); + } // ----- print special description of this element @@ -11703,7 +12042,8 @@ static struct { { EL_EMERALD, &level.score[SC_EMERALD], TEXT_COLLECTING }, { EL_BD_DIAMOND, &level.score[SC_EMERALD], TEXT_COLLECTING }, - { EL_BD_DIAMOND, &level.score[SC_DIAMOND_EXTRA], TEXT_COLLECTING_EXTRA }, + { EL_BDX_DIAMOND, &level.score[SC_EMERALD], TEXT_COLLECTING }, + { EL_BDX_DIAMOND, &level.score[SC_DIAMOND_EXTRA], TEXT_COLLECTING_EXTRA }, { EL_EMERALD_YELLOW, &level.score[SC_EMERALD], TEXT_COLLECTING }, { EL_EMERALD_RED, &level.score[SC_EMERALD], TEXT_COLLECTING }, { EL_EMERALD_PURPLE, &level.score[SC_EMERALD], TEXT_COLLECTING }, @@ -11781,21 +12121,22 @@ static struct { EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, { EL_BD_AMOEBA, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, { EL_EMC_DRIPPER, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, - { EL_BD_AMOEBA, &level.bd_amoeba_threshold_too_big, TEXT_AMOEBA_THRESHOED }, - { EL_BD_AMOEBA, &level.bd_amoeba_slow_growth_time, TEXT_AMOEBA_SLOW_TIME }, - { EL_BD_AMOEBA, &level.bd_amoeba_slow_growth_rate, TEXT_AMOEBA_SLOW_RATE, + { EL_BDX_AMOEBA_1, &level.bd_amoeba_1_threshold_too_big, TEXT_AMOEBA_THRESHOED }, + { EL_BDX_AMOEBA_1, &level.bd_amoeba_1_slow_growth_time, TEXT_AMOEBA_SLOW_TIME }, + { EL_BDX_AMOEBA_2, &level.bd_amoeba_1_slow_growth_rate, TEXT_AMOEBA_SLOW_RATE, 0, 100 }, - { EL_BD_AMOEBA, &level.bd_amoeba_fast_growth_rate, TEXT_AMOEBA_FAST_RATE, + { EL_BDX_AMOEBA_1, &level.bd_amoeba_1_fast_growth_rate, TEXT_AMOEBA_FAST_RATE, 0, 100 }, - { EL_BD_AMOEBA_2, &level.bd_amoeba_2_threshold_too_big, TEXT_AMOEBA_THRESHOED }, - { EL_BD_AMOEBA_2, &level.bd_amoeba_2_slow_growth_time, TEXT_AMOEBA_SLOW_TIME }, - { EL_BD_AMOEBA_2, &level.bd_amoeba_2_slow_growth_rate, TEXT_AMOEBA_SLOW_RATE, + { EL_BDX_AMOEBA_2, &level.bd_amoeba_2_threshold_too_big, TEXT_AMOEBA_THRESHOED }, + { EL_BDX_AMOEBA_2, &level.bd_amoeba_2_slow_growth_time, TEXT_AMOEBA_SLOW_TIME }, + { EL_BDX_AMOEBA_2, &level.bd_amoeba_2_slow_growth_rate, TEXT_AMOEBA_SLOW_RATE, 0, 100 }, - { EL_BD_AMOEBA_2, &level.bd_amoeba_2_fast_growth_rate, TEXT_AMOEBA_FAST_RATE, + { EL_BDX_AMOEBA_2, &level.bd_amoeba_2_fast_growth_rate, TEXT_AMOEBA_FAST_RATE, 0, 100 }, { EL_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION }, - { EL_BD_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION }, { EL_DC_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION }, + { EL_BD_MAGIC_WALL, &level.time_magic_wall, TEXT_DURATION }, + { EL_BDX_MAGIC_WALL, &level.bd_magic_wall_time, TEXT_DURATION }, { EL_ROBOT_WHEEL, &level.time_wheel, TEXT_DURATION }, { EL_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION }, { EL_DC_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION }, @@ -11803,42 +12144,42 @@ static struct { EL_LIGHT_SWITCH_ACTIVE, &level.time_light, TEXT_DURATION }, { EL_SHIELD_NORMAL, &level.shield_normal_time, TEXT_DURATION }, { EL_SHIELD_DEADLY, &level.shield_deadly_time, TEXT_DURATION }, - { EL_BD_CLOCK, &level.bd_clock_extra_time, TEXT_TIME_BONUS, + { EL_BDX_CLOCK, &level.bd_clock_extra_time, TEXT_TIME_BONUS, -100, 100 }, - { EL_BD_VOODOO_DOLL, &level.bd_voodoo_penalty_time, TEXT_TIME_PENALTY, + { EL_BDX_VOODOO_DOLL, &level.bd_voodoo_penalty_time, TEXT_TIME_PENALTY, 0, 100 }, - { EL_BD_SLIME, &level.bd_slime_permeability_rate, TEXT_PERMEABILITY_RATE, + { EL_BDX_SLIME, &level.bd_slime_permeability_rate, TEXT_PERMEABILITY_RATE, 0, 100 }, - { EL_BD_SLIME, &level.bd_slime_permeability_bits_c64, TEXT_PERMEABILITY_BITS, + { EL_BDX_SLIME, &level.bd_slime_permeability_bits_c64, TEXT_PERMEABILITY_BITS, 0, 255 }, - { EL_BD_SLIME, &level.bd_slime_random_seed_c64, TEXT_RANDOM_SEED, + { EL_BDX_SLIME, &level.bd_slime_random_seed_c64, TEXT_RANDOM_SEED, -1, 65535 }, - { EL_BD_ACID, &level.bd_acid_spread_rate, TEXT_ACID_SPREAD_RATE, + { EL_BDX_ACID, &level.bd_acid_spread_rate, TEXT_ACID_SPREAD_RATE, 0, 100 }, - { EL_BD_BITER, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, + { EL_BDX_BITER, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, 0, 3 }, - { EL_BD_BITER_RIGHT, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, + { EL_BDX_BITER_RIGHT, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, 0, 3 }, - { EL_BD_BITER_UP, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, + { EL_BDX_BITER_UP, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, 0, 3 }, - { EL_BD_BITER_LEFT, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, + { EL_BDX_BITER_LEFT, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, 0, 3 }, - { EL_BD_BITER_DOWN, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, + { EL_BDX_BITER_DOWN, &level.bd_biter_move_delay, TEXT_BITER_MOVE_DELAY, 0, 3 }, - { EL_BD_REPLICATOR, &level.bd_replicator_create_delay, TEXT_REPLICATION_DELAY, + { EL_BDX_REPLICATOR, &level.bd_replicator_create_delay, TEXT_REPLICATION_DELAY, 0, 100 }, - { EL_BD_PNEUMATIC_HAMMER, &level.bd_hammer_walls_break_delay, TEXT_HAMMER_BREAK_DELAY, + { EL_BDX_PNEUMATIC_HAMMER, &level.bd_hammer_walls_break_delay, TEXT_HAMMER_BREAK_DELAY, 1, 100 }, - { EL_BD_PNEUMATIC_HAMMER, &level.bd_hammer_walls_reappear_delay, TEXT_HAMMER_REAPPEAR_DELAY, + { EL_BDX_PNEUMATIC_HAMMER, &level.bd_hammer_walls_reappear_delay, TEXT_HAMMER_REAPPEAR_DELAY, 1, 200 }, - { EL_BD_POT, &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED, + { EL_BDX_POT, &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED, 0, 50 }, - { EL_BD_SKELETON, &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED, + { EL_BDX_SKELETON, &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED, 0, 50 }, - { EL_BD_SKELETON, &level.bd_skeleton_worth_num_diamonds, TEXT_SKELETONS_WORTH, + { EL_BDX_SKELETON, &level.bd_skeleton_worth_num_diamonds, TEXT_SKELETONS_WORTH, 0, 10 }, - { EL_BD_CREATURE_SWITCH, &level.bd_creatures_auto_turn_delay, TEXT_AUTO_TURN_DELAY }, - { EL_BD_GRAVITY_SWITCH, &level.bd_gravity_switch_delay, TEXT_GRAVITY_DELAY, + { EL_BDX_CREATURE_SWITCH, &level.bd_creatures_auto_turn_delay, TEXT_AUTO_TURN_DELAY }, + { EL_BDX_GRAVITY_SWITCH, &level.bd_gravity_switch_delay, TEXT_GRAVITY_DELAY, 1, 60 }, { EL_EXTRA_TIME, &level.extra_time, TEXT_TIME_BONUS }, { EL_TIME_ORB_FULL, &level.time_orb_time, TEXT_TIME_BONUS }, @@ -11877,10 +12218,6 @@ static boolean checkPropertiesConfig(int element) if (element == EL_EMPTY_SPACE && level.game_engine_type != GAME_ENGINE_TYPE_RND) return FALSE; - // special case: BD style rock customization only available in BD game engine - if (element == EL_BD_ROCK && level.game_engine_type != GAME_ENGINE_TYPE_BD) - return FALSE; - if (IS_GEM(element) || IS_CUSTOM_ELEMENT(element) || IS_GROUP_ELEMENT(element) || @@ -11891,32 +12228,34 @@ static boolean checkPropertiesConfig(int element) IS_MM_MCDUFFIN(element) || IS_DF_LASER(element) || IS_PLAYER_ELEMENT(element) || - IS_BD_PLAYER_ELEMENT(element) || + IS_BDX_PLAYER_ELEMENT(element) || IS_BD_FIREFLY(properties_element) || - IS_BD_FIREFLY_2(properties_element) || + IS_BDX_FIREFLY_1(properties_element) || + IS_BDX_FIREFLY_2(properties_element) || IS_BD_BUTTERFLY(properties_element) || - IS_BD_BUTTERFLY_2(properties_element) || - IS_BD_STONEFLY(properties_element) || - IS_BD_DRAGONFLY(properties_element) || - IS_BD_EXPANDABLE_WALL(properties_element) || - IS_BD_EXPANDABLE_STEELWALL(properties_element) || - IS_BD_CONVEYOR_BELT(properties_element) || - IS_BD_CONVEYOR_BELT_SWITCH(properties_element) || + IS_BDX_BUTTERFLY_1(properties_element) || + IS_BDX_BUTTERFLY_2(properties_element) || + IS_BDX_STONEFLY(properties_element) || + IS_BDX_DRAGONFLY(properties_element) || + IS_BDX_EXPANDABLE_WALL(properties_element) || + IS_BDX_EXPANDABLE_STEELWALL(properties_element) || + IS_BDX_CONVEYOR_BELT(properties_element) || + IS_BDX_CONVEYOR_BELT_SWITCH(properties_element) || IS_SOKOBAN_OBJECT_OR_FIELD(element) || HAS_EDITOR_CONTENT(element) || CAN_GROW(element) || COULD_MOVE_INTO_ACID(element) || MAYBE_DONT_COLLIDE_WITH(element) || - element == EL_BD_SAND || - element == EL_BD_ROCK || - element == EL_BD_MEGA_ROCK || - element == EL_BD_BOMB || - element == EL_BD_ROCKET_LAUNCHER || - element == EL_BD_NITRO_PACK || - element == EL_BD_SWEET || - element == EL_BD_VOODOO_DOLL || - element == EL_BD_WATER || - element == EL_BD_GRAVITY_SWITCH) + element == EL_BDX_SAND_1 || + element == EL_BDX_ROCK || + element == EL_BDX_MEGA_ROCK || + element == EL_BDX_BOMB || + element == EL_BDX_ROCKET_LAUNCHER || + element == EL_BDX_NITRO_PACK || + element == EL_BDX_SWEET || + element == EL_BDX_VOODOO_DOLL || + element == EL_BDX_WATER || + element == EL_BDX_GRAVITY_SWITCH) { return TRUE; } @@ -11952,6 +12291,7 @@ static void SetAutomaticNumberOfGemsNeeded(void) case EL_EMERALD_RED: case EL_EMERALD_PURPLE: case EL_BD_DIAMOND: + case EL_BDX_DIAMOND: case EL_WALL_EMERALD: case EL_WALL_EMERALD_YELLOW: case EL_WALL_EMERALD_RED: @@ -12011,59 +12351,27 @@ static void DrawPropertiesConfig(void) if (elements_with_counter[i].element != properties_element) continue; - // special case: score for extra diamonds only available in BD game engine - if (elements_with_counter[i].element == EL_BD_DIAMOND && - elements_with_counter[i].value == &level.score[SC_DIAMOND_EXTRA] && - level.game_engine_type != GAME_ENGINE_TYPE_BD) - continue; - - // special case: some amoeba counters only available in BD game engine - if (elements_with_counter[i].element == EL_BD_AMOEBA && - elements_with_counter[i].value != &level.amoeba_speed && - level.game_engine_type != GAME_ENGINE_TYPE_BD) - continue; - - // special case: score for smashing only available in R'n'D game engine - if ((IS_BD_FIREFLY(elements_with_counter[i].element) || - IS_BD_BUTTERFLY(elements_with_counter[i].element)) && - (elements_with_counter[i].value == &level.score[SC_BUG] || - elements_with_counter[i].value == &level.score[SC_SPACESHIP]) && - level.game_engine_type == GAME_ENGINE_TYPE_BD) - continue; - - // special case: some amoeba counters only available in R'n'D game engine - if (elements_with_counter[i].element == EL_BD_AMOEBA && - elements_with_counter[i].value == &level.amoeba_speed && - level.game_engine_type == GAME_ENGINE_TYPE_BD) - continue; - int counter_id = ED_COUNTER_ID_ELEMENT_VALUE1 + num_element_counters; counterbutton_info[counter_id].y = - ED_ELEMENT_SETTINGS_YPOS((HAS_EDITOR_CONTENT(properties_element) ? 1 : 0) + - (CAN_GROW(properties_element) ? 1 : 0) + - (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0) + - (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0) + - (properties_element == EL_BD_VOODOO_DOLL ? 4 : 0) + - (properties_element == EL_BD_SLIME ? 1 : 0) + - (properties_element == EL_BD_ACID ? 1 : 0) + - (properties_element == EL_BD_REPLICATOR ? 1 : 0) + - (properties_element == EL_BD_CREATURE_SWITCH ? 1 : 0) + - (properties_element == EL_BD_GRAVITY_SWITCH ? 2 : 0) + - (properties_element == EL_EMC_MAGIC_BALL ? 2 : 0) + + ED_ELEMENT_SETTINGS_YPOS((HAS_EDITOR_CONTENT(properties_element) ? 1 : 0) + + (CAN_GROW(properties_element) ? 1 : 0) + + (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0) + + (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0) + + (properties_element == EL_BDX_AMOEBA_1 ? 3 : 0) + + (properties_element == EL_BDX_AMOEBA_2 ? 3 : 0) + + (properties_element == EL_BDX_MAGIC_WALL ? 1 : 0) + + (properties_element == EL_BDX_VOODOO_DOLL ? 4 : 0) + + (properties_element == EL_BDX_SLIME ? 1 : 0) + + (properties_element == EL_BDX_ACID ? 1 : 0) + + (properties_element == EL_BDX_REPLICATOR ? 1 : 0) + + (properties_element == EL_BDX_CREATURE_SWITCH ? 1 : 0) + + (properties_element == EL_BDX_GRAVITY_SWITCH ? 2 : 0) + + (properties_element == EL_EMC_MAGIC_BALL ? 2 : 0) + num_element_counters); - // special case: set magic wall counter for BD game engine separately - if (properties_element == EL_BD_MAGIC_WALL && level.game_engine_type == GAME_ENGINE_TYPE_BD) - counterbutton_info[counter_id].y = ED_ELEMENT_SETTINGS_YPOS(1); - - // special case: set amoeba counters for BD game engine separately - if ((properties_element == EL_BD_AMOEBA && level.game_engine_type == GAME_ENGINE_TYPE_BD) || - (properties_element == EL_BD_AMOEBA_2)) - counterbutton_info[counter_id].y = ED_ELEMENT_SETTINGS_YPOS(3 + num_element_counters); - // special case: set position for delay counter for reappearing hammered walls - if (properties_element == EL_BD_PNEUMATIC_HAMMER && num_element_counters > 0) + if (properties_element == EL_BDX_PNEUMATIC_HAMMER && num_element_counters > 0) counterbutton_info[counter_id].y += 1; counterbutton_info[counter_id].value = elements_with_counter[i].value; @@ -12082,7 +12390,7 @@ static void DrawPropertiesConfig(void) break; } - if (properties_element == EL_BD_MAGIC_WALL && level.game_engine_type == GAME_ENGINE_TYPE_BD) + if (properties_element == EL_BDX_MAGIC_WALL) { // draw stickybutton gadget MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); @@ -12106,15 +12414,15 @@ static void DrawPropertiesConfig(void) // draw stickybutton gadget MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); - if (properties_element == EL_BD_AMOEBA && level.game_engine_type == GAME_ENGINE_TYPE_BD) + if (properties_element == EL_BDX_AMOEBA_1) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY); - MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_CONTENT_TOO_BIG); - MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_CONTENT_ENCLOSED); + MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_TOO_BIG); + MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_ENCLOSED); } - else if (properties_element == EL_BD_AMOEBA_2) + else if (properties_element == EL_BDX_AMOEBA_2) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY); @@ -12129,16 +12437,16 @@ static void DrawPropertiesConfig(void) { MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT); } - else if (properties_element == EL_BD_ACID) + else if (properties_element == EL_BDX_ACID) { MapDrawingArea(ED_DRAWING_ID_BD_ACID_EATS_ELEMENT); MapDrawingArea(ED_DRAWING_ID_BD_ACID_TURNS_TO_ELEMENT); } - else if (IS_BD_BITER(properties_element)) + else if (IS_BDX_BITER(properties_element)) { MapDrawingArea(ED_DRAWING_ID_BD_BITER_EATS_ELEMENT); } - else if (properties_element == EL_BD_BLADDER) + else if (properties_element == EL_BDX_BLADDER) { MapDrawingArea(ED_DRAWING_ID_BD_BLADDER_CONVERTS_BY_ELEMENT); } @@ -12245,7 +12553,7 @@ static void DrawPropertiesConfig(void) } } - if (IS_BD_PLAYER_ELEMENT(properties_element)) + if (IS_BDX_PLAYER_ELEMENT(properties_element)) { counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y = ED_ELEMENT_SETTINGS_YPOS(2); @@ -12267,12 +12575,12 @@ static void DrawPropertiesConfig(void) MapDrawingArea(ED_DRAWING_ID_BD_SNAP_ELEMENT); } - if (properties_element == EL_BD_SAND) + if (properties_element == EL_BDX_SAND_1) { MapDrawingArea(ED_DRAWING_ID_BD_SAND_LOOKS_LIKE); } - if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD) + if (properties_element == EL_BDX_ROCK) { counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y = ED_ELEMENT_SETTINGS_YPOS(0); @@ -12286,7 +12594,7 @@ static void DrawPropertiesConfig(void) MapDrawingArea(ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_IMPACT); } - if (properties_element == EL_BD_DIAMOND && level.game_engine_type == GAME_ENGINE_TYPE_BD) + if (properties_element == EL_BDX_DIAMOND) { MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_FALLING); MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT); @@ -12294,47 +12602,47 @@ static void DrawPropertiesConfig(void) if (level.game_engine_type == GAME_ENGINE_TYPE_BD) { - if (IS_BD_FIREFLY(properties_element)) + if (IS_BDX_FIREFLY_1(properties_element)) { - MapDrawingArea(ED_DRAWING_ID_BD_FIREFLY_EXPLODES_TO); + MapDrawingArea(ED_DRAWING_ID_BD_FIREFLY_1_EXPLODES_TO); MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO); } - else if (IS_BD_FIREFLY_2(properties_element)) + else if (IS_BDX_FIREFLY_2(properties_element)) { MapDrawingArea(ED_DRAWING_ID_BD_FIREFLY_2_EXPLODES_TO); MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO); } - else if (IS_BD_BUTTERFLY(properties_element)) + else if (IS_BDX_BUTTERFLY_1(properties_element)) { - MapDrawingArea(ED_DRAWING_ID_BD_BUTTERFLY_EXPLODES_TO); + MapDrawingArea(ED_DRAWING_ID_BD_BUTTERFLY_1_EXPLODES_TO); MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO); } - else if (IS_BD_BUTTERFLY_2(properties_element)) + else if (IS_BDX_BUTTERFLY_2(properties_element)) { MapDrawingArea(ED_DRAWING_ID_BD_BUTTERFLY_2_EXPLODES_TO); MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO); } - else if (IS_BD_STONEFLY(properties_element)) + else if (IS_BDX_STONEFLY(properties_element)) { MapDrawingArea(ED_DRAWING_ID_BD_STONEFLY_EXPLODES_TO); } - else if (IS_BD_DRAGONFLY(properties_element)) + else if (IS_BDX_DRAGONFLY(properties_element)) { MapDrawingArea(ED_DRAWING_ID_BD_DRAGONFLY_EXPLODES_TO); MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO); } - else if (properties_element == EL_BD_BOMB) + else if (properties_element == EL_BDX_BOMB) { MapDrawingArea(ED_DRAWING_ID_BD_BOMB_EXPLOSION_TURNS_TO); } - else if (properties_element == EL_BD_NITRO_PACK) + else if (properties_element == EL_BDX_NITRO_PACK) { MapDrawingArea(ED_DRAWING_ID_BD_NITRO_EXPLOSION_TURNS_TO); } } - if (properties_element == EL_BD_MEGA_ROCK || - properties_element == EL_BD_SWEET) + if (properties_element == EL_BDX_MEGA_ROCK || + properties_element == EL_BDX_SWEET) { counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y = ED_ELEMENT_SETTINGS_YPOS(0); @@ -12345,7 +12653,7 @@ static void DrawPropertiesConfig(void) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET); } - if (properties_element == EL_BD_VOODOO_DOLL) + if (properties_element == EL_BDX_VOODOO_DOLL) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_COLLECTS_DIAMONDS); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_HURT_KILLS_PLAYER); @@ -12353,7 +12661,7 @@ static void DrawPropertiesConfig(void) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_VANISH_BY_EXPLOSION); } - if (properties_element == EL_BD_SLIME) + if (properties_element == EL_BDX_SLIME) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE); @@ -12365,49 +12673,49 @@ static void DrawPropertiesConfig(void) MapDrawingArea(ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3); } - if (IS_BD_EXPANDABLE_WALL(properties_element) || - IS_BD_EXPANDABLE_STEELWALL(properties_element)) + if (IS_BDX_EXPANDABLE_WALL(properties_element) || + IS_BDX_EXPANDABLE_STEELWALL(properties_element)) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CHANGE_EXPANDING_WALL); - if (IS_BD_EXPANDABLE_WALL(properties_element)) + if (IS_BDX_EXPANDABLE_WALL(properties_element)) MapDrawingArea(ED_DRAWING_ID_BD_EXPANDING_WALL_LOOKS_LIKE); } - if (properties_element == EL_BD_REPLICATOR) + if (properties_element == EL_BDX_REPLICATOR) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_REPLICATORS_ACTIVE); } - if (IS_BD_CONVEYOR_BELT(properties_element) || - IS_BD_CONVEYOR_BELT_SWITCH(properties_element)) + if (IS_BDX_CONVEYOR_BELT(properties_element) || + IS_BDX_CONVEYOR_BELT_SWITCH(properties_element)) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_ACTIVE); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED); } - if (properties_element == EL_BD_WATER) + if (properties_element == EL_BDX_WATER) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN); } - if (properties_element == EL_BD_PNEUMATIC_HAMMER) + if (properties_element == EL_BDX_PNEUMATIC_HAMMER) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR); } - if (properties_element == EL_BD_ROCKET_LAUNCHER) + if (properties_element == EL_BDX_ROCKET_LAUNCHER) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS); } - if (properties_element == EL_BD_CREATURE_SWITCH) + if (properties_element == EL_BDX_CREATURE_SWITCH) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING); } - if (properties_element == EL_BD_GRAVITY_SWITCH) + if (properties_element == EL_BDX_GRAVITY_SWITCH) { MapSelectboxGadget(ED_SELECTBOX_ID_BD_GRAVITY_DIRECTION); @@ -12415,7 +12723,7 @@ static void DrawPropertiesConfig(void) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL); } - if (properties_element == EL_BD_NUT) + if (properties_element == EL_BDX_NUT) { MapDrawingArea(ED_DRAWING_ID_BD_NUT_CONTENT); } @@ -12706,9 +13014,22 @@ static void DrawEditorElementAnimation(int x, int y) int graphic; int frame; - getEditorGraphicAndFrame(properties_element, &graphic, &frame, FALSE); + if (IS_BDX_RUNTIME_ELEMENT(properties_element)) + { + el2edimg_with_frame(properties_element, &graphic, &frame); + + DrawFixedGraphicExt(drawto, x, y, graphic, frame); + } + else + { + graphic = el2img(properties_element); + 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); - DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING); + DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING); + } } static void DrawEditorElementName(int x, int y, int font_nr) @@ -13637,6 +13958,7 @@ static void SetElementIntelliDraw(int x, int y, int dx, int dy, int new_element, { EL_EMERALD_PURPLE, EL_WALL_EMERALD_PURPLE }, { EL_DIAMOND, EL_WALL_DIAMOND }, { EL_BD_DIAMOND, EL_WALL_BD_DIAMOND }, + { EL_BDX_DIAMOND, EL_BDX_WALL_DIAMOND }, { EL_GATE_1, EL_GATE_1_GRAY }, { EL_GATE_2, EL_GATE_2_GRAY }, { EL_GATE_3, EL_GATE_3_GRAY }, @@ -15981,6 +16303,15 @@ static void HandleTextInputGadgets(struct GadgetInfo *gi) ModifyEditorElementList(); // update changed button info text } + else if (type_id >= ED_TEXTINPUT_ID_COLORS_FIRST && + type_id <= ED_TEXTINPUT_ID_COLORS_LAST) + { + int pos = type_id - ED_TEXTINPUT_ID_COLORS_FIRST; + + *bd_color[pos] = gd_color_get_from_string(bd_color_text[pos]); + + DrawColorBox_BD(pos); + } // do not mark level as modified for certain non-level-changing gadgets if (type_id >= ED_TEXTINPUT_ID_LEVELSET_FIRST && @@ -16050,6 +16381,37 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) // update BD cycle delay counter gadgets depending on BD scheduling type DrawLevelConfigWindow(); } + else if (type_id == ED_SELECTBOX_ID_BD_COLOR_TYPE) + { + bd_color_type_changed = TRUE; + + if (level.bd_color_type != GD_COLOR_TYPE_RGB && level.bd_color_type != GetCommonColorType_BD()) + { + // color type switched to non-RGB colors, but using different color type => reset colors + char *message = (level.bd_color_type == bd_color_type_default ? + "This will reset colors to defaults! Continue?" : + "This will reset colors to random colors! Continue?"); + + if (!Request(message, REQ_ASK)) + { + // keep current RGB colors + level.bd_color_type = GD_COLOR_TYPE_RGB; + bd_color_type_changed = FALSE; + } + } + + // update BD color palette gadgets depending on BD color type + DrawLevelConfigWindow(); + } + else if (type_id >= ED_SELECTBOX_ID_COLORS_FIRST && + type_id <= ED_SELECTBOX_ID_COLORS_LAST) + { + int pos = type_id - ED_SELECTBOX_ID_COLORS_FIRST; + + *bd_color[pos] = gd_c64_color(bd_color_c64[pos]); + + DrawColorBox_BD(pos); + } // do not mark level as modified for certain non-level-changing gadgets if (type_id == ED_SELECTBOX_ID_LEVELSET_SAVE_MODE || @@ -16212,6 +16574,13 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) level.changed = TRUE; } + else if (type_id == ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS) + { + SetRandomLevelColors_BD(level.bd_color_type); + + // update BD color palette gadgets after setting random colors + DrawLevelConfigWindow(); + } } static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi)