X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=73d2c36f336d13cedc4b39741d0823a8b06670b7;hb=afbad74c77ab1a2cac76b0ce8f633da50a8f52ab;hp=a3fc486f04d8e10a367493c20eac118646480796;hpb=0e6b99fa178d72b30aa23ce4eb300827ec50b64a;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index a3fc486f..73d2c36f 100644 --- a/src/editor.c +++ b/src/editor.c @@ -557,16 +557,32 @@ enum GADGET_ID_ANDROID_CONTENT, GADGET_ID_AMOEBA_CONTENT, GADGET_ID_BD_SNAP_ELEMENT, + GADGET_ID_BD_MAGIC_WALL_DIAMOND_TO, + GADGET_ID_BD_MAGIC_WALL_ROCK_TO, + GADGET_ID_BD_MAGIC_WALL_MEGA_ROCK_TO, + GADGET_ID_BD_MAGIC_WALL_NUT_TO, + 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_2_CONTENT_TOO_BIG, GADGET_ID_BD_AMOEBA_2_CONTENT_ENCLOSED, GADGET_ID_BD_AMOEBA_2_CONTENT_EXPLODING, GADGET_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE, + GADGET_ID_BD_SLIME_EATS_ELEMENT_1, + GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1, + GADGET_ID_BD_SLIME_EATS_ELEMENT_2, + GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2, + GADGET_ID_BD_SLIME_EATS_ELEMENT_3, + GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3, GADGET_ID_BD_ACID_EATS_ELEMENT, GADGET_ID_BD_ACID_TURNS_TO_ELEMENT, GADGET_ID_BD_BITER_EATS_ELEMENT, GADGET_ID_BD_BLADDER_CONVERTS_BY_ELEMENT, + GADGET_ID_BD_NUT_CONTENT, + GADGET_ID_BD_EXPANDING_WALL_LOOKS_LIKE, + GADGET_ID_BD_SAND_LOOKS_LIKE, GADGET_ID_START_ELEMENT, GADGET_ID_ARTWORK_ELEMENT, GADGET_ID_EXPLOSION_ELEMENT, @@ -731,6 +747,10 @@ enum GADGET_ID_BD_SLIME_IS_PREDICTABLE, GADGET_ID_BD_CHANGE_EXPANDING_WALL, GADGET_ID_BD_REPLICATORS_ACTIVE, + GADGET_ID_BD_CONVEYOR_BELTS_ACTIVE, + GADGET_ID_BD_CONVEYOR_BELTS_CHANGED, + GADGET_ID_BD_WATER_CANNOT_FLOW_DOWN, + GADGET_ID_BD_HAMMER_WALLS_REAPPEAR, GADGET_ID_ENVELOPE_AUTOWRAP, GADGET_ID_ENVELOPE_CENTERED, GADGET_ID_MM_LASER_RED, @@ -1078,6 +1098,10 @@ enum ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE, ED_CHECKBUTTON_ID_BD_CHANGE_EXPANDING_WALL, ED_CHECKBUTTON_ID_BD_REPLICATORS_ACTIVE, + ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_ACTIVE, + ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED, + ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN, + ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR, ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP, ED_CHECKBUTTON_ID_ENVELOPE_CENTERED, ED_CHECKBUTTON_ID_MM_LASER_RED, @@ -1174,16 +1198,32 @@ enum ED_DRAWING_ID_ANDROID_CONTENT, ED_DRAWING_ID_AMOEBA_CONTENT, ED_DRAWING_ID_BD_SNAP_ELEMENT, + ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO, + ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO, + ED_DRAWING_ID_BD_MAGIC_WALL_MEGA_ROCK_TO, + ED_DRAWING_ID_BD_MAGIC_WALL_NUT_TO, + 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_2_CONTENT_TOO_BIG, ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_ENCLOSED, ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_EXPLODING, ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE, + ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_1, + ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1, + ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_2, + ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2, + ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_3, + ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3, ED_DRAWING_ID_BD_ACID_EATS_ELEMENT, ED_DRAWING_ID_BD_ACID_TURNS_TO_ELEMENT, ED_DRAWING_ID_BD_BITER_EATS_ELEMENT, ED_DRAWING_ID_BD_BLADDER_CONVERTS_BY_ELEMENT, + ED_DRAWING_ID_BD_NUT_CONTENT, + ED_DRAWING_ID_BD_EXPANDING_WALL_LOOKS_LIKE, + ED_DRAWING_ID_BD_SAND_LOOKS_LIKE, ED_DRAWING_ID_START_ELEMENT, ED_DRAWING_ID_ARTWORK_ELEMENT, ED_DRAWING_ID_EXPLOSION_ELEMENT, @@ -3736,7 +3776,7 @@ static struct }, { ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING, - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING, GADGET_ID_NONE, &level.bd_magic_wall_wait_hatching, NULL, NULL, @@ -3744,7 +3784,7 @@ static struct }, { ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA, - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA, GADGET_ID_NONE, &level.bd_magic_wall_stops_amoeba, NULL, NULL, @@ -3808,7 +3848,7 @@ static struct }, { ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE, - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_BD_SLIME_IS_PREDICTABLE, GADGET_ID_NONE, &level.bd_slime_is_predictable, NULL, NULL, @@ -3830,6 +3870,38 @@ static struct NULL, NULL, "Active at start", "Replicators start in active state" }, + { + ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_ACTIVE, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), + GADGET_ID_BD_CONVEYOR_BELTS_ACTIVE, GADGET_ID_NONE, + &level.bd_conveyor_belts_active, + NULL, NULL, + "Active at start", "Conveyor belts start in active state" + }, + { + ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_BD_CONVEYOR_BELTS_CHANGED, GADGET_ID_NONE, + &level.bd_conveyor_belts_changed, + NULL, NULL, + "Change direction", "Switch conveyor belt direction" + }, + { + ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), + GADGET_ID_BD_WATER_CANNOT_FLOW_DOWN, GADGET_ID_NONE, + &level.bd_water_cannot_flow_down, + NULL, NULL, + "Does not flow downwards", "Water can only flow up, left and right" + }, + { + ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_BD_HAMMER_WALLS_REAPPEAR, GADGET_ID_NONE, + &level.bd_hammer_walls_reappear, + NULL, NULL, + "Hammered walls reappear", "Hammered walls reappear after delay" + }, { ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), @@ -4312,6 +4384,65 @@ static struct "Snap element:", NULL, NULL, NULL, "Element created when snapping" }, + // ---------- BD magic wall elements ---------------------------------------- + + { + ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(4), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_MAGIC_WALL_DIAMOND_TO, GADGET_ID_NONE, + &level.bd_magic_wall_diamond_to, 1, 1, + "Changes diamonds to:", NULL, NULL, NULL, "Element to turn diamonds to" + }, + { + ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(5), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_MAGIC_WALL_ROCK_TO, GADGET_ID_NONE, + &level.bd_magic_wall_rock_to, 1, 1, + "Changes rocks to:", NULL, NULL, NULL, "Element to turn rocks to" + }, + { + ED_DRAWING_ID_BD_MAGIC_WALL_MEGA_ROCK_TO, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(6), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_MAGIC_WALL_MEGA_ROCK_TO, GADGET_ID_NONE, + &level.bd_magic_wall_mega_rock_to, 1, 1, + "Changes mega rocks to:", NULL, NULL, NULL, "Element to turn mega rocks to" + }, + { + ED_DRAWING_ID_BD_MAGIC_WALL_NUT_TO, + 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_MAGIC_WALL_NUT_TO, GADGET_ID_NONE, + &level.bd_magic_wall_nut_to, 1, 1, + "Changes nuts to:", NULL, NULL, NULL, "Element to turn nuts to" + }, + { + ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO, + 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_MAGIC_WALL_NITRO_PACK_TO, GADGET_ID_NONE, + &level.bd_magic_wall_nitro_pack_to, 1, 1, + "Changes nitro packs to:", NULL, NULL, NULL, "Element to turn nitro packs to" + }, + { + ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(9), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO, GADGET_ID_NONE, + &level.bd_magic_wall_flying_diamond_to, 1, 1, + "Changes flying diamonds to:", NULL, NULL, NULL, "Element to turn flying diamonds to" + }, + { + ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(10), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_MAGIC_WALL_FLYING_ROCK_TO, GADGET_ID_NONE, + &level.bd_magic_wall_flying_rock_to, 1, 1, + "Changes flying rocks to:", NULL, NULL, NULL, "Element to turn flying rocks to" + }, + // ---------- BD amoeba content --------------------------------------------- { @@ -4365,6 +4496,54 @@ static struct &level.bd_amoeba_2_content_looks_like, 1, 1, "Use graphic of element:", NULL, NULL, NULL, "BD amoeba 2 looks like this element" }, + { + ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_1, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(5), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_SLIME_EATS_ELEMENT_1, GADGET_ID_NONE, + &level.bd_slime_eats_element_1, 1, 1, + "Can eat:", NULL, NULL, NULL, "Element that can be eaten" + }, + { + ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(5), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1, GADGET_ID_BD_SLIME_EATS_ELEMENT_1, + &level.bd_slime_converts_to_element_1, 1, 1, + " and convert to:", NULL, NULL, NULL, "Eaten element is converted to" + }, + { + ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_2, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(6), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_SLIME_EATS_ELEMENT_2, GADGET_ID_NONE, + &level.bd_slime_eats_element_2, 1, 1, + "Can eat:", NULL, NULL, NULL, "Element that can be eaten" + }, + { + ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(6), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2, GADGET_ID_BD_SLIME_EATS_ELEMENT_2, + &level.bd_slime_converts_to_element_2, 1, 1, + " and convert to:", NULL, NULL, NULL, "Eaten element is converted to" + }, + { + ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_3, + 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_SLIME_EATS_ELEMENT_3, GADGET_ID_NONE, + &level.bd_slime_eats_element_3, 1, 1, + "Can eat:", NULL, NULL, NULL, "Element that can be eaten" + }, + { + ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3, + 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_SLIME_CONVERTS_TO_ELEMENT_3, GADGET_ID_BD_SLIME_EATS_ELEMENT_3, + &level.bd_slime_converts_to_element_3, 1, 1, + " and convert to:", NULL, NULL, NULL, "Eaten element is converted to" + }, { ED_DRAWING_ID_BD_ACID_EATS_ELEMENT, ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(1), @@ -4397,6 +4576,30 @@ static struct &level.bd_bladder_converts_by_element, 1, 1, "Turns to clock by touching:", NULL, NULL, NULL, "Turns to clock by touching element" }, + { + ED_DRAWING_ID_BD_NUT_CONTENT, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(1), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_NUT_CONTENT, GADGET_ID_NONE, + &level.bd_nut_content, 1, 1, + "When breaking, changes to:", NULL, NULL, NULL, "Element created when breaking nut" + }, + { + ED_DRAWING_ID_BD_EXPANDING_WALL_LOOKS_LIKE, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(1), + ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, + GADGET_ID_BD_EXPANDING_WALL_LOOKS_LIKE, GADGET_ID_NONE, + &level.bd_expanding_wall_looks_like, 1, 1, + "Use graphic of element:", NULL, NULL, NULL, "Expanding wall looks like this element" + }, + { + ED_DRAWING_ID_BD_SAND_LOOKS_LIKE, + 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_SAND_LOOKS_LIKE, GADGET_ID_NONE, + &level.bd_sand_looks_like, 1, 1, + "Use graphic of element:", NULL, NULL, NULL, "Sand looks like this element" + }, // ---------- level start element ------------------------------------------- @@ -4644,6 +4847,7 @@ 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 @@ -4852,7 +5056,7 @@ static int editor_el_boulderdash_native[] = EL_BD_CONVEYOR_LEFT, EL_BD_CONVEYOR_RIGHT, EL_BD_CONVEYOR_SWITCH, - EL_BD_CONVEYOR_DIR_SWITCH_RIGHT, + EL_BD_CONVEYOR_DIR_SWITCH_NORMAL, EL_BD_CLOCK, EL_BD_TIME_PENALTY, @@ -4879,10 +5083,10 @@ static int editor_el_boulderdash_native[] = 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_POT, EL_BD_PLAYER, EL_BD_PLAYER_WITH_BOMB, @@ -4894,6 +5098,141 @@ static int *editor_el_boulderdash_native_ptr = editor_el_boulderdash_native; static int num_editor_hl_boulderdash_native = ARRAY_SIZE(editor_hl_boulderdash_native); static int num_editor_el_boulderdash_native = ARRAY_SIZE(editor_el_boulderdash_native); +static int editor_hl_boulderdash_effects[] = +{ + EL_INTERNAL_CASCADE_BD_EFFECTS_ACTIVE, + EL_CHAR('B'), + EL_CHAR('D'), + EL_CHAR('E'), +}; + +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_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, +}; +static int *editor_hl_boulderdash_effects_ptr = editor_hl_boulderdash_effects; +static int *editor_el_boulderdash_effects_ptr = editor_el_boulderdash_effects; +static int num_editor_hl_boulderdash_effects = ARRAY_SIZE(editor_hl_boulderdash_effects); +static int num_editor_el_boulderdash_effects = ARRAY_SIZE(editor_el_boulderdash_effects); + static int editor_hl_emerald_mine[] = { EL_INTERNAL_CASCADE_EM_ACTIVE, @@ -6305,6 +6644,7 @@ static boolean setup_editor_cascade_never = FALSE; static boolean setup_editor_el_players = TRUE; static boolean setup_editor_el_boulderdash = TRUE; static boolean setup_editor_el_boulderdash_native = TRUE; +static boolean setup_editor_el_boulderdash_effects = TRUE; static boolean setup_editor_el_emerald_mine = TRUE; static boolean setup_editor_el_emerald_mine_club = TRUE; static boolean setup_editor_el_more = TRUE; @@ -6357,6 +6697,12 @@ editor_elements_info[] = &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, + &editor_hl_boulderdash_effects_ptr, &num_editor_hl_boulderdash_effects, + &editor_el_boulderdash_effects_ptr, &num_editor_el_boulderdash_effects + }, { &setup_editor_el_emerald_mine, &setup.editor_cascade.el_em, @@ -6657,6 +7003,7 @@ static void ReinitializeElementList_EnableSections(void) setup_editor_el_players = TRUE; setup_editor_el_boulderdash = TRUE; setup_editor_el_boulderdash_native = TRUE; + setup_editor_el_boulderdash_effects = TRUE; setup_editor_el_emerald_mine = TRUE; setup_editor_el_emerald_mine_club = TRUE; setup_editor_el_more = TRUE; @@ -6680,6 +7027,7 @@ static void ReinitializeElementList_EnableSections(void) setup_editor_el_players = FALSE; setup_editor_el_boulderdash = FALSE; setup_editor_el_boulderdash_native = FALSE; + setup_editor_el_boulderdash_effects = FALSE; setup_editor_el_emerald_mine = FALSE; setup_editor_el_emerald_mine_club = FALSE; setup_editor_el_more = FALSE; @@ -6711,6 +7059,7 @@ static void ReinitializeElementList_EnableSections(void) if (level.game_engine_type == GAME_ENGINE_TYPE_RND) { setup_editor_el_boulderdash_native = FALSE; + setup_editor_el_boulderdash_effects = FALSE; setup_editor_el_mirror_magic = FALSE; setup_editor_el_deflektor = FALSE; } @@ -6736,6 +7085,7 @@ static void ReinitializeElementList_EnableSections(void) { setup_editor_el_boulderdash = FALSE; setup_editor_el_boulderdash_native = FALSE; + setup_editor_el_boulderdash_effects = FALSE; setup_editor_el_more = FALSE; setup_editor_el_sokoban = FALSE; setup_editor_el_supaplex = FALSE; @@ -6752,6 +7102,7 @@ static void ReinitializeElementList_EnableSections(void) setup_editor_el_players = FALSE; setup_editor_el_boulderdash = FALSE; setup_editor_el_boulderdash_native = FALSE; + setup_editor_el_boulderdash_effects = FALSE; setup_editor_el_emerald_mine = FALSE; setup_editor_el_emerald_mine_club = FALSE; setup_editor_el_more = FALSE; @@ -6770,6 +7121,7 @@ static void ReinitializeElementList_EnableSections(void) setup_editor_el_players = FALSE; setup_editor_el_boulderdash = FALSE; setup_editor_el_boulderdash_native = FALSE; + setup_editor_el_boulderdash_effects = FALSE; setup_editor_el_emerald_mine = FALSE; setup_editor_el_emerald_mine_club = FALSE; setup_editor_el_more = FALSE; @@ -7140,11 +7492,21 @@ static void DrawDrawingArea(int id) int tilesize = ED_DRAWINGAREA_TILE_SIZE; for (x = 0; x < area_xsize; x++) + { for (y = 0; y < area_ysize; y++) + { + int element = value[x * area_ysize + y]; + int graphic; + int frame; + + getEditorGraphicAndFrame(element, &graphic, &frame, TRUE); + DrawSizedGraphicExt(drawto, gi->x + x * tilesize, gi->y + y * tilesize, - el2edimg(value[x * area_ysize + y]), 0, tilesize); + graphic, frame, tilesize); + } + } } static void ScrollEditorLevel(int from_x, int from_y, int scroll) @@ -7178,10 +7540,47 @@ 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) { - getSizedGraphicSource(el2edimg(element), 0, tile_size, bitmap, x, y); + int graphic; + int frame; + + getEditorGraphicAndFrame(element, &graphic, &frame, TRUE); + + getSizedGraphicSource(graphic, frame, tile_size, bitmap, x, y); } static void CreateControlButtons(void) @@ -10887,37 +11286,41 @@ static void DrawPropertiesInfo(void) PrintInfoText(no_description_text, font1_nr, xpos, ypos - line1_height); } -#define TEXT_COLLECTING "Score for collecting" -#define TEXT_COLLECTING_EXTRA "Score for extra diamonds" -#define TEXT_SMASHING "Score for smashing" -#define TEXT_SLURPING "Score for slurping robot" -#define TEXT_CRACKING "Score for cracking" -#define TEXT_AMOEBA_SPEED "Speed of amoeba growth" -#define TEXT_AMOEBA_THRESHOED "Size for turning to rocks" -#define TEXT_AMOEBA_SLOW_TIME "Slow growth time (seconds)" -#define TEXT_AMOEBA_SLOW_RATE "Slow growth rate (percent)" -#define TEXT_AMOEBA_FAST_RATE "Fast growth rate (percent)" -#define TEXT_DURATION "Duration when activated" -#define TEXT_DELAY_ON "Delay before activating" -#define TEXT_DELAY_OFF "Delay before deactivating" -#define TEXT_DELAY_CHANGING "Delay before changing" -#define TEXT_DELAY_EXPLODING "Delay before exploding" -#define TEXT_DELAY_MOVING "Delay before moving" -#define TEXT_BALL_DELAY "Element generation delay" -#define TEXT_MOVE_SPEED "Speed of android moving" -#define TEXT_CLONE_SPEED "Speed of android cloning" -#define TEXT_GAME_OF_LIFE_1 "Min neighbours to survive" -#define TEXT_GAME_OF_LIFE_2 "Max neighbours to survive" -#define TEXT_GAME_OF_LIFE_3 "Min neighbours to create" -#define TEXT_GAME_OF_LIFE_4 "Max neighbours to create" -#define TEXT_TIME_BONUS "Extra time to solve level" -#define TEXT_TIME_PENALTY "Time penalty if destroyed" -#define TEXT_PERMEABILITY_RATE "slime permeability rate" -#define TEXT_PERMEABILITY_BITS "slime permeability bits" -#define TEXT_RANDOM_SEED "slime random number seed" -#define TEXT_ACID_SPREAD_RATE "Spread rate (percent)" -#define TEXT_BITER_MOVE_DELAY "Move delay (BD frames)" -#define TEXT_REPLICATION_DELAY "Create delay (BD frames)" +#define TEXT_COLLECTING "Score for collecting" +#define TEXT_COLLECTING_EXTRA "Score for extra diamonds" +#define TEXT_SMASHING "Score for smashing" +#define TEXT_SLURPING "Score for slurping robot" +#define TEXT_CRACKING "Score for cracking" +#define TEXT_AMOEBA_SPEED "Speed of amoeba growth" +#define TEXT_AMOEBA_THRESHOED "Size for turning to rocks" +#define TEXT_AMOEBA_SLOW_TIME "Slow growth time (seconds)" +#define TEXT_AMOEBA_SLOW_RATE "Slow growth rate (percent)" +#define TEXT_AMOEBA_FAST_RATE "Fast growth rate (percent)" +#define TEXT_DURATION "Duration when activated" +#define TEXT_DELAY_ON "Delay before activating" +#define TEXT_DELAY_OFF "Delay before deactivating" +#define TEXT_DELAY_CHANGING "Delay before changing" +#define TEXT_DELAY_EXPLODING "Delay before exploding" +#define TEXT_DELAY_MOVING "Delay before moving" +#define TEXT_BALL_DELAY "Element generation delay" +#define TEXT_MOVE_SPEED "Speed of android moving" +#define TEXT_CLONE_SPEED "Speed of android cloning" +#define TEXT_GAME_OF_LIFE_1 "Min neighbours to survive" +#define TEXT_GAME_OF_LIFE_2 "Max neighbours to survive" +#define TEXT_GAME_OF_LIFE_3 "Min neighbours to create" +#define TEXT_GAME_OF_LIFE_4 "Max neighbours to create" +#define TEXT_TIME_BONUS "Extra time to solve level" +#define TEXT_TIME_PENALTY "Time penalty if destroyed" +#define TEXT_PERMEABILITY_RATE "slime permeability rate" +#define TEXT_PERMEABILITY_BITS "slime permeability bits" +#define TEXT_RANDOM_SEED "slime random number seed" +#define TEXT_ACID_SPREAD_RATE "Spread rate (percent)" +#define TEXT_BITER_MOVE_DELAY "Move delay (BD frames)" +#define TEXT_REPLICATION_DELAY "Create delay (BD frames)" +#define TEXT_HAMMER_BREAK_DELAY "Delay for breaking walls" +#define TEXT_HAMMER_REAPPEAR_DELAY "Delay for reappearing walls" +#define TEXT_SKELETONS_NEEDED "Skeletons needed to use pot" +#define TEXT_SKELETONS_WORTH "Counts as this many diamonds" static struct { @@ -11054,6 +11457,16 @@ static struct 0, 3 }, { EL_BD_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, + 1, 100 }, + { EL_BD_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, + 0, 50 }, + { EL_BD_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, + 0, 10 }, { EL_EXTRA_TIME, &level.extra_time, TEXT_TIME_BONUS }, { EL_TIME_ORB_FULL, &level.time_orb_time, TEXT_TIME_BONUS }, { EL_GAME_OF_LIFE, &level.game_of_life[0], TEXT_GAME_OF_LIFE_1,0,8 }, @@ -11107,15 +11520,20 @@ static boolean checkPropertiesConfig(int element) IS_PLAYER_ELEMENT(element) || IS_BD_PLAYER_ELEMENT(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_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_SWEET || - element == EL_BD_VOODOO_DOLL) + element == EL_BD_VOODOO_DOLL || + element == EL_BD_WATER) { return TRUE; } @@ -11242,11 +11660,19 @@ static void DrawPropertiesConfig(void) (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) + counterbutton_info[counter_id].y += 1; + counterbutton_info[counter_id].value = elements_with_counter[i].value; counterbutton_info[counter_id].text_right = elements_with_counter[i].text; counterbutton_info[counter_id].min_value = elements_with_counter[i].min_value; @@ -11263,6 +11689,23 @@ static void DrawPropertiesConfig(void) break; } + if (properties_element == EL_BD_MAGIC_WALL && level.game_engine_type == GAME_ENGINE_TYPE_BD) + { + // draw stickybutton gadget + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); + + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA); + + MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO); + MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO); + MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_MEGA_ROCK_TO); + MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_NUT_TO); + MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO); + MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO); + MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO); + } + if (HAS_EDITOR_CONTENT(properties_element)) { // draw stickybutton gadget @@ -11423,6 +11866,11 @@ static void DrawPropertiesConfig(void) MapDrawingArea(ED_DRAWING_ID_BD_SNAP_ELEMENT); } + if (properties_element == EL_BD_SAND) + { + MapDrawingArea(ED_DRAWING_ID_BD_SAND_LOOKS_LIKE); + } + if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD) { counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y = @@ -11457,17 +11905,22 @@ static void DrawPropertiesConfig(void) if (properties_element == EL_BD_SLIME) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE); - } - if (properties_element == EL_BD_MAGIC_WALL) - { - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA); + MapDrawingArea(ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_1); + MapDrawingArea(ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1); + MapDrawingArea(ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_2); + MapDrawingArea(ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2); + MapDrawingArea(ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_3); + MapDrawingArea(ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3); } - if (IS_BD_EXPANDABLE_WALL(properties_element)) + if (IS_BD_EXPANDABLE_WALL(properties_element) || + IS_BD_EXPANDABLE_STEELWALL(properties_element)) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CHANGE_EXPANDING_WALL); + + if (IS_BD_EXPANDABLE_WALL(properties_element)) + MapDrawingArea(ED_DRAWING_ID_BD_EXPANDING_WALL_LOOKS_LIKE); } if (properties_element == EL_BD_REPLICATOR) @@ -11475,6 +11928,28 @@ static void DrawPropertiesConfig(void) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_REPLICATORS_ACTIVE); } + if (IS_BD_CONVEYOR_BELT(properties_element) || + IS_BD_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) + { + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN); + } + + if (properties_element == EL_BD_PNEUMATIC_HAMMER) + { + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR); + } + + if (properties_element == EL_BD_NUT) + { + MapDrawingArea(ED_DRAWING_ID_BD_NUT_CONTENT); + } + // special case: slippery walls option for gems only available in R'n'D game engine if (IS_GEM(properties_element) && level.game_engine_type == GAME_ENGINE_TYPE_RND) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS); @@ -11757,11 +12232,10 @@ static void DrawPropertiesChange(void) static void DrawEditorElementAnimation(int x, int y) { - int graphic = el2img(properties_element); - int frame = (ANIM_MODE(graphic) == ANIM_CE_VALUE ? - custom_element.ce_value_fixed_initial : - ANIM_MODE(graphic) == ANIM_CE_SCORE ? - custom_element.collect_score_initial : FrameCounter); + int graphic; + int frame; + + getEditorGraphicAndFrame(properties_element, &graphic, &frame, FALSE); DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING); }