X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=9f917b4325b1c77332eb30fef73d7b02c4498b4e;hb=35a2f21580d9bd01f55e1265fc8174cfcbdd5ad9;hp=c5b1b4a7438e0d111df54a712e70d926ae331436;hpb=6e065ecbabc724e459b1fa0b60dd493aa165dfd0;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index c5b1b4a7..9f917b43 100644 --- a/src/editor.c +++ b/src/editor.c @@ -435,6 +435,18 @@ enum GADGET_ID_BD_CYCLE_DELAY_C64_DOWN, GADGET_ID_BD_CYCLE_DELAY_C64_TEXT, GADGET_ID_BD_CYCLE_DELAY_C64_UP, + GADGET_ID_BD_HATCHING_DELAY_CYCLES_DOWN, + GADGET_ID_BD_HATCHING_DELAY_CYCLES_TEXT, + GADGET_ID_BD_HATCHING_DELAY_CYCLES_UP, + GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN, + GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT, + GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP, + GADGET_ID_BD_PUSHING_PROB_DOWN, + GADGET_ID_BD_PUSHING_PROB_TEXT, + GADGET_ID_BD_PUSHING_PROB_UP, + GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_DOWN, + GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_TEXT, + GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_UP, GADGET_ID_ELEMENT_VALUE1_DOWN, GADGET_ID_ELEMENT_VALUE1_TEXT, GADGET_ID_ELEMENT_VALUE1_UP, @@ -544,6 +556,12 @@ enum GADGET_ID_MAGIC_BALL_CONTENT_7, GADGET_ID_ANDROID_CONTENT, GADGET_ID_AMOEBA_CONTENT, + 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_START_ELEMENT, GADGET_ID_ARTWORK_ELEMENT, GADGET_ID_EXPLOSION_ELEMENT, @@ -658,6 +676,10 @@ enum GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_BD_INTERMISSION, GADGET_ID_BD_PAL_TIMING, + GADGET_ID_BD_LINE_SHIFTING_BORDERS, + GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW, + GADGET_ID_BD_SHORT_EXPLOSIONS, + GADGET_ID_BD_GRAVITY_AFFECTS_ALL, GADGET_ID_STICK_ELEMENT, GADGET_ID_EM_SLIPPERY_GEMS, GADGET_ID_EM_EXPLODES_BY_FIRE, @@ -690,6 +712,13 @@ enum GADGET_ID_CAN_MOVE_INTO_ACID, GADGET_ID_DONT_COLLIDE_WITH, GADGET_ID_BD_DIAGONAL_MOVEMENTS, + GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE, + GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET, + GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING, + GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA, + GADGET_ID_BD_AMOEBA_WAIT_FOR_HATCHING, + GADGET_ID_BD_AMOEBA_START_IMMEDIATELY, + GADGET_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA, GADGET_ID_ENVELOPE_AUTOWRAP, GADGET_ID_ENVELOPE_CENTERED, GADGET_ID_MM_LASER_RED, @@ -760,6 +789,10 @@ enum ED_COUNTER_ID_LEVEL_RANDOM, ED_COUNTER_ID_BD_CYCLE_DELAY_MS, ED_COUNTER_ID_BD_CYCLE_DELAY_C64, + ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES, + ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS, + ED_COUNTER_ID_BD_PUSHING_PROB, + ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET, ED_COUNTER_ID_ELEMENT_VALUE1, ED_COUNTER_ID_ELEMENT_VALUE2, ED_COUNTER_ID_ELEMENT_VALUE3, @@ -983,6 +1016,10 @@ enum ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2, ED_CHECKBUTTON_ID_BD_INTERMISSION, ED_CHECKBUTTON_ID_BD_PAL_TIMING, + ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS, + ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW, + ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS, + ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL, ED_CHECKBUTTON_ID_STICK_ELEMENT, ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS, ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE, @@ -1015,6 +1052,13 @@ enum ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID, ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH, ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS, + ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE, + ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET, + ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING, + ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA, + ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING, + ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY, + ED_CHECKBUTTON_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA, ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP, ED_CHECKBUTTON_ID_ENVELOPE_CENTERED, ED_CHECKBUTTON_ID_MM_LASER_RED, @@ -1064,7 +1108,7 @@ enum #define ED_CHECKBUTTON_ID_EDITOR_LAST ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2 #define ED_CHECKBUTTON_ID_ENGINE_FIRST ED_CHECKBUTTON_ID_BD_INTERMISSION -#define ED_CHECKBUTTON_ID_ENGINE_LAST ED_CHECKBUTTON_ID_BD_PAL_TIMING +#define ED_CHECKBUTTON_ID_ENGINE_LAST ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC #define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE @@ -1110,6 +1154,12 @@ enum ED_DRAWING_ID_MAGIC_BALL_CONTENT_7, ED_DRAWING_ID_ANDROID_CONTENT, ED_DRAWING_ID_AMOEBA_CONTENT, + 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_START_ELEMENT, ED_DRAWING_ID_ARTWORK_ELEMENT, ED_DRAWING_ID_EXPLOSION_ELEMENT, @@ -1515,9 +1565,45 @@ static struct &level.bd_cycle_delay_c64, NULL, NULL, "game cycle delay (C64-style)" }, + { + ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4), + 1, 40, + GADGET_ID_BD_HATCHING_DELAY_CYCLES_DOWN, GADGET_ID_BD_HATCHING_DELAY_CYCLES_UP, + GADGET_ID_BD_HATCHING_DELAY_CYCLES_TEXT, GADGET_ID_NONE, + &level.bd_hatching_delay_cycles, + NULL, NULL, "hatching delay (cycles)" + }, + { + ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4), + 1, 40, + GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN, GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP, + GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT, GADGET_ID_NONE, + &level.bd_hatching_delay_seconds, + NULL, NULL, "hatching delay (seconds)" + }, // ---------- element settings: configure (various elements) ---------------- + { + ED_COUNTER_ID_BD_PUSHING_PROB, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), + 0, 100, + GADGET_ID_BD_PUSHING_PROB_DOWN, GADGET_ID_BD_PUSHING_PROB_UP, + GADGET_ID_BD_PUSHING_PROB_TEXT, GADGET_ID_NONE, + &level.bd_pushing_prob, + NULL, NULL, "push probability" + }, + { + ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), + 0, 100, + GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_DOWN, GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_UP, + GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_TEXT, GADGET_ID_NONE, + &level.bd_pushing_prob_with_sweet, + NULL, NULL, "push probability with sweet" + }, { ED_COUNTER_ID_ELEMENT_VALUE1, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), @@ -3317,6 +3403,38 @@ static struct NULL, NULL, "PAL timing", "use slower timer (like PAL C64)" }, + { + ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(6), + GADGET_ID_BD_LINE_SHIFTING_BORDERS, GADGET_ID_NONE, + &level.bd_line_shifting_borders, + "Compatibility settings:", NULL, + "line-shifting borders", "use line-shifting wrap-around" + }, + { + ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(7), + GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW, GADGET_ID_NONE, + &level.bd_scan_first_and_last_row, + NULL, NULL, + "scan first and last row", "also process top/bottom border rows" + }, + { + ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(8), + GADGET_ID_BD_SHORT_EXPLOSIONS, GADGET_ID_NONE, + &level.bd_short_explosions, + NULL, NULL, + "short explosions", "use four game cycles for explosions" + }, + { + ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(9), + GADGET_ID_BD_GRAVITY_AFFECTS_ALL, GADGET_ID_NONE, + &level.bd_gravity_affects_all, + NULL, NULL, + "gravity change affects everything", "gravity affects all falling objects" + }, // ---------- element settings: configure (various elements) ---------------- @@ -3576,6 +3694,62 @@ static struct NULL, NULL, "can move diagonally", "player can move diagonally" }, + { + ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE, GADGET_ID_NONE, + &level.bd_topmost_player_active, + NULL, NULL, + "topmost player is active", "use first player found on playfield" + }, + { + ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), + GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET, GADGET_ID_NONE, + &level.bd_push_mega_rock_with_sweet, + NULL, NULL, + "mega rocks pushable with sweet", "push mega rocks after eating sweet" + }, + { + ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING, GADGET_ID_NONE, + &level.bd_magic_wall_wait_hatching, + NULL, NULL, + "wait for player's birth", "timer start waits for player's birth" + }, + { + ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), + GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA, GADGET_ID_NONE, + &level.bd_magic_wall_stops_amoeba, + NULL, NULL, + "turn amoeba to diamonds", "activation changes amoeba to diamonds" + }, + { + ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), + GADGET_ID_BD_AMOEBA_WAIT_FOR_HATCHING, GADGET_ID_NONE, + &level.bd_amoeba_wait_for_hatching, + NULL, NULL, + "wait for player's birth", "timer start waits for player's birth" + }, + { + ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), + GADGET_ID_BD_AMOEBA_START_IMMEDIATELY, GADGET_ID_NONE, + &level.bd_amoeba_start_immediately, + NULL, NULL, + "start growing immediately", "start slow growth time immediately" + }, + { + ED_CHECKBUTTON_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), + GADGET_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA, GADGET_ID_NONE, + &level.bd_amoeba_2_explode_by_amoeba, + NULL, NULL, + "explodes if touched by amoeba", "amoeba 2 explodes if touched by amoeba" + }, { ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), @@ -4047,6 +4221,60 @@ static struct "content:", NULL, NULL, NULL, "amoeba content" }, + // ---------- BD amoeba content ------------------------------------------------ + + { + ED_DRAWING_ID_BD_AMOEBA_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" + }, + { + ED_DRAWING_ID_BD_AMOEBA_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" + }, + + // ---------- BD amoeba 2 content ------------------------------------------------ + + { + ED_DRAWING_ID_BD_AMOEBA_2_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_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" + }, + { + ED_DRAWING_ID_BD_AMOEBA_2_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_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" + }, + { + ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_EXPLODING, + 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_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" + }, + { + ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE, + ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(11), + 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" + }, + // ---------- level start element ------------------------------------------- { @@ -4385,13 +4613,13 @@ static int editor_el_boulderdash_native[] = EL_BD_STEELWALL, EL_BD_WALL, - EL_EMPTY, + EL_BD_SAND_2, EL_BD_MAGIC_WALL, EL_BD_AMOEBA, EL_BD_BUTTERFLY_UP, EL_BD_FIREFLY_UP, - EL_EXIT_CLOSED, + EL_BD_EXIT_CLOSED, EL_BD_BUTTERFLY_LEFT, EL_BD_FIREFLY_LEFT, @@ -4401,39 +4629,39 @@ static int editor_el_boulderdash_native[] = EL_BD_INBOX, EL_BD_BUTTERFLY_DOWN, EL_BD_FIREFLY_DOWN, - EL_EXIT_OPEN, + EL_BD_EXIT_OPEN, EL_BD_AMOEBA_2, EL_BD_BUTTERFLY_2_UP, EL_BD_FIREFLY_2_UP, - EL_EMPTY, + EL_BD_SLIME, EL_BD_BUTTERFLY_2_LEFT, EL_BD_FIREFLY_2_LEFT, EL_BD_BUTTERFLY_2_RIGHT, EL_BD_FIREFLY_2_RIGHT, - EL_EMPTY, + EL_BD_BOMB, EL_BD_BUTTERFLY_2_DOWN, EL_BD_FIREFLY_2_DOWN, - EL_EMPTY, + EL_BD_FLYING_DIAMOND, - EL_EMPTY, + EL_BD_NITRO_PACK, EL_BD_DRAGONFLY_UP, EL_BD_STONEFLY_UP, - EL_EMPTY, + EL_BD_DIAMOND_GLUED, EL_BD_DRAGONFLY_LEFT, EL_BD_STONEFLY_LEFT, EL_BD_DRAGONFLY_RIGHT, EL_BD_STONEFLY_RIGHT, - EL_EMPTY, + EL_BD_NUT, EL_BD_DRAGONFLY_DOWN, EL_BD_STONEFLY_DOWN, EL_EMPTY, - EL_EMPTY, + EL_BD_BITER_SWITCH_1, EL_BD_BITER_UP, EL_BD_COW_UP, EL_EMPTY, @@ -4443,15 +4671,15 @@ static int editor_el_boulderdash_native[] = EL_BD_BITER_RIGHT, EL_BD_COW_RIGHT, - EL_EMPTY, + EL_BD_VOODOO_DOLL, EL_BD_BITER_DOWN, EL_BD_COW_DOWN, - EL_EMPTY, + EL_BD_GHOST, - EL_EMPTY, - EL_BD_SAND, + 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, @@ -4463,100 +4691,75 @@ static int editor_el_boulderdash_native[] = EL_BD_WALL_SLOPED_DOWN_LEFT, EL_BD_WALL_SLOPED_DOWN_RIGHT, - EL_BD_FLYING_DIAMOND, EL_BD_FLYING_ROCK, + EL_BD_ROCK_GLUED, EL_BD_STEELWALL_SLOPED_UP_LEFT, EL_BD_STEELWALL_SLOPED_UP_RIGHT, - EL_BD_NUT, - EL_BD_MEGA_ROCK, + EL_BD_WAITING_ROCK, + EL_BD_CHASING_ROCK, EL_BD_STEELWALL_SLOPED_DOWN_LEFT, EL_BD_STEELWALL_SLOPED_DOWN_RIGHT, - EL_BD_SAND_2, - EL_BD_WALL_NON_SLOPED, - EL_BD_WALL, - EL_BD_MAGIC_WALL, - - EL_BD_EXIT_CLOSED, - EL_BD_EXIT_OPEN, + EL_BD_MEGA_ROCK, + EL_BD_SWEET, EL_BD_INVISIBLE_EXIT_CLOSED, EL_BD_INVISIBLE_EXIT_OPEN, - EL_BD_STEELWALL, 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_CREATURE_SWITCH, + EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL, EL_BD_EXPANDABLE_STEELWALL_HORIZONTAL, EL_BD_EXPANDABLE_STEELWALL_VERTICAL, EL_BD_EXPANDABLE_STEELWALL_ANY, - EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL, + EL_BD_CREATURE_SWITCH, - EL_BD_BITER_SWITCH_1, + 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_RIGHT, - EL_BD_ACID, - EL_BD_FALLING_WALL, - EL_BD_BOX, + EL_BD_CLOCK, EL_BD_TIME_PENALTY, - EL_BD_GRAVESTONE, - EL_BD_ROCK_GLUED, - EL_BD_DIAMOND_GLUED, - EL_BD_DIAMOND_KEY, + EL_BD_SKELETON, - EL_BD_TRAPPED_DIAMOND, - EL_BD_CLOCK, - EL_BD_SAND_GLUED, 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_EMPTY, + 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_GATE_1, - EL_BD_GATE_2, - EL_BD_GATE_3, - EL_BD_POT, - EL_BD_GRAVITY_SWITCH, EL_BD_PNEUMATIC_HAMMER, EL_BD_TELEPORTER, - EL_BD_SKELETON, - - EL_BD_AMOEBA, - EL_BD_AMOEBA_2, - EL_BD_REPLICATOR, - EL_BD_BLADDER_SPENDER, - - EL_BD_CONVEYOR_LEFT, - EL_BD_CONVEYOR_RIGHT, - EL_BD_BOMB, - EL_BD_NITRO_PACK, - - EL_BD_LAVA, - EL_BD_SWEET, - EL_BD_VOODOO_DOLL, - EL_BD_SLIME, - - EL_BD_BLADDER, - EL_BD_WAITING_ROCK, - EL_BD_CHASING_ROCK, - EL_BD_GHOST, + EL_BD_POT, EL_BD_PLAYER, EL_BD_PLAYER_WITH_BOMB, @@ -6178,7 +6381,7 @@ static int getTextWidthForDrawingArea(char *text) if (text == NULL) return 0; - return (getTextWidth(text, FONT_TEXT_1) + ED_DRAWINGAREA_TEXT_DISTANCE); + return (getTextWidth(text, FONT_TEXT_1) + ED_DRAWINGAREA_BORDER_SIZE); } static int getRightGadgetBorder(struct GadgetInfo *gi, char *text) @@ -8021,16 +8224,12 @@ static void MapCounterButtons(int id) ModifyEditorCounterValue(id, *counterbutton_info[id].value); - // set position for "value[1,2,3,4]" counter gadgets (score in most cases) - if (id >= ED_COUNTER_ID_ELEMENT_VALUE1 && - id <= ED_COUNTER_ID_ELEMENT_VALUE4) + // set position for counter gadgets with dynamically determined position + if (id != ED_COUNTER_ID_SELECT_LEVEL) { - ModifyGadget(gi_down, GDI_Y, - SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END); - ModifyGadget(gi_text, GDI_Y, - SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END); - ModifyGadget(gi_up, GDI_Y, - SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END); + ModifyGadget(gi_down, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END); + ModifyGadget(gi_text, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END); + ModifyGadget(gi_up, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END); } // vertical position might have changed after setting position above @@ -8089,7 +8288,7 @@ static void MapDrawingArea(int id) int area_ysize = gi->drawing.area_ysize; int xoffset_left = getTextWidthForDrawingArea(drawingarea_info[id].text_left); int xoffset_below = getTextWidth(drawingarea_info[id].text_below, font_nr); - int x_left = gi->x - xoffset_left; + int x_left = gi->x - xoffset_left - ED_DRAWINGAREA_BORDER_SIZE; int x_right = gi->x + gi->width + ED_DRAWINGAREA_TEXT_DISTANCE; int x_above = gi->x - ED_DRAWINGAREA_BORDER_SIZE; int x_below = gi->x + (gi->width - xoffset_below) / 2; @@ -10072,9 +10271,15 @@ static void DrawLevelConfigEngine(void) // draw counter gadgets if (level.bd_scheduling_type == GD_SCHEDULING_MILLISECONDS) + { MapCounterButtons(ED_COUNTER_ID_BD_CYCLE_DELAY_MS); + MapCounterButtons(ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES); + } else + { MapCounterButtons(ED_COUNTER_ID_BD_CYCLE_DELAY_C64); + MapCounterButtons(ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS); + } // draw checkbutton gadgets for (i = ED_CHECKBUTTON_ID_ENGINE_FIRST; i <= ED_CHECKBUTTON_ID_ENGINE_LAST; i++) @@ -10564,6 +10769,10 @@ static void DrawPropertiesInfo(void) #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" @@ -10584,125 +10793,141 @@ static struct int element; int *value; char *text; + int min_value; + int max_value; } elements_with_counter[] = { - { 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_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 }, - { EL_SP_INFOTRON, &level.score[SC_EMERALD], TEXT_COLLECTING }, - { EL_DIAMOND, &level.score[SC_DIAMOND], TEXT_COLLECTING }, - { EL_CRYSTAL, &level.score[SC_CRYSTAL], TEXT_COLLECTING }, - { EL_PEARL, &level.score[SC_PEARL], TEXT_COLLECTING }, - { EL_BUG, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_BUG_RIGHT, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_BUG_UP, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_BUG_LEFT, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_BUG_DOWN, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_BD_BUTTERFLY, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_BD_BUTTERFLY_RIGHT, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_BD_BUTTERFLY_UP, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_BD_BUTTERFLY_LEFT, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_BD_BUTTERFLY_DOWN, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_SP_ELECTRON, &level.score[SC_BUG], TEXT_SMASHING }, - { EL_SPACESHIP, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_SPACESHIP_RIGHT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_SPACESHIP_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_SPACESHIP_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_SPACESHIP_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_BD_FIREFLY, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_BD_FIREFLY_RIGHT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_BD_FIREFLY_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_BD_FIREFLY_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_BD_FIREFLY_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_SP_SNIKSNAK, &level.score[SC_SPACESHIP], TEXT_SMASHING }, - { EL_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING }, - { EL_YAMYAM_LEFT, &level.score[SC_YAMYAM], TEXT_SMASHING }, - { EL_YAMYAM_RIGHT, &level.score[SC_YAMYAM], TEXT_SMASHING }, - { EL_YAMYAM_UP, &level.score[SC_YAMYAM], TEXT_SMASHING }, - { EL_YAMYAM_DOWN, &level.score[SC_YAMYAM], TEXT_SMASHING }, - { EL_DARK_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING }, - { EL_ROBOT, &level.score[SC_ROBOT], TEXT_SMASHING }, - { EL_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_NUT, &level.score[SC_NUT], TEXT_CRACKING }, - { EL_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING }, - { EL_EM_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING }, - { EL_DYNABOMB_INCREASE_NUMBER,&level.score[SC_DYNAMITE], TEXT_COLLECTING }, - { EL_DYNABOMB_INCREASE_SIZE, &level.score[SC_DYNAMITE], TEXT_COLLECTING }, - { EL_DYNABOMB_INCREASE_POWER, &level.score[SC_DYNAMITE], TEXT_COLLECTING }, - { EL_SHIELD_NORMAL, &level.score[SC_SHIELD], TEXT_COLLECTING }, - { EL_SHIELD_DEADLY, &level.score[SC_SHIELD], TEXT_COLLECTING }, - { EL_EXTRA_TIME, &level.extra_time_score, TEXT_COLLECTING }, - { EL_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_EM_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_EM_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_EM_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_EM_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_EMC_KEY_5, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_EMC_KEY_6, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_EMC_KEY_7, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_EMC_KEY_8, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_DC_KEY_WHITE, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_MM_KETTLE, &level.score[SC_EMERALD], TEXT_COLLECTING }, - { EL_DF_CELL, &level.score[SC_EMERALD], TEXT_COLLECTING }, - { EL_MM_KEY, &level.score[SC_KEY], TEXT_COLLECTING }, - { EL_MM_LIGHTBALL, &level.score[SC_ELEM_BONUS], TEXT_COLLECTING }, - { EL_MM_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_MM_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_MM_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_MM_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_MM_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING }, - { EL_AMOEBA_WET, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, - { EL_AMOEBA_DRY, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, - { EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, - { EL_BD_AMOEBA, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, - { EL_EMC_DRIPPER, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, - { 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_ROBOT_WHEEL, &level.time_wheel, TEXT_DURATION }, - { EL_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION }, - { EL_DC_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION }, - { EL_LIGHT_SWITCH, &level.time_light, TEXT_DURATION }, - { 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_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 }, - { EL_GAME_OF_LIFE, &level.game_of_life[1], TEXT_GAME_OF_LIFE_2 }, - { EL_GAME_OF_LIFE, &level.game_of_life[2], TEXT_GAME_OF_LIFE_3 }, - { EL_GAME_OF_LIFE, &level.game_of_life[3], TEXT_GAME_OF_LIFE_4 }, - { EL_BIOMAZE, &level.biomaze[0], TEXT_GAME_OF_LIFE_1 }, - { EL_BIOMAZE, &level.biomaze[1], TEXT_GAME_OF_LIFE_2 }, - { EL_BIOMAZE, &level.biomaze[2], TEXT_GAME_OF_LIFE_3 }, - { EL_BIOMAZE, &level.biomaze[3], TEXT_GAME_OF_LIFE_4 }, - { EL_EMC_ANDROID, &level.android_move_time, TEXT_MOVE_SPEED }, - { EL_EMC_ANDROID, &level.android_clone_time, TEXT_CLONE_SPEED }, - { EL_EMC_MAGIC_BALL, &level.ball_time, TEXT_BALL_DELAY }, - { EL_EMC_LENSES, &level.lenses_score, TEXT_COLLECTING }, - { EL_EMC_MAGNIFIER, &level.magnify_score, TEXT_COLLECTING }, - { EL_SPRING, &level.slurp_score, TEXT_SLURPING }, - { EL_SPRING_LEFT, &level.slurp_score, TEXT_SLURPING }, - { EL_SPRING_RIGHT, &level.slurp_score, TEXT_SLURPING }, - { EL_EMC_LENSES, &level.lenses_time, TEXT_DURATION }, - { EL_EMC_MAGNIFIER, &level.magnify_time, TEXT_DURATION }, - { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse, TEXT_DELAY_OFF }, - { EL_MM_BOMB, &level.mm_time_bomb, TEXT_DELAY_EXPLODING }, - { EL_MM_GRAY_BALL, &level.mm_time_ball, TEXT_DELAY_CHANGING }, - { EL_MM_STEEL_BLOCK, &level.mm_time_block, TEXT_DELAY_MOVING }, - { EL_MM_WOODEN_BLOCK, &level.mm_time_block, TEXT_DELAY_MOVING }, - - { -1, NULL, NULL } + { 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_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 }, + { EL_SP_INFOTRON, &level.score[SC_EMERALD], TEXT_COLLECTING }, + { EL_DIAMOND, &level.score[SC_DIAMOND], TEXT_COLLECTING }, + { EL_CRYSTAL, &level.score[SC_CRYSTAL], TEXT_COLLECTING }, + { EL_PEARL, &level.score[SC_PEARL], TEXT_COLLECTING }, + { EL_BUG, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BUG_RIGHT, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BUG_UP, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BUG_LEFT, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BUG_DOWN, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BD_BUTTERFLY, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BD_BUTTERFLY_RIGHT, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BD_BUTTERFLY_UP, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BD_BUTTERFLY_LEFT, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BD_BUTTERFLY_DOWN, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_SP_ELECTRON, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_SPACESHIP, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_SPACESHIP_RIGHT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_SPACESHIP_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_SPACESHIP_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_SPACESHIP_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_BD_FIREFLY, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_BD_FIREFLY_RIGHT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_BD_FIREFLY_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_BD_FIREFLY_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_BD_FIREFLY_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_SP_SNIKSNAK, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING }, + { EL_YAMYAM_LEFT, &level.score[SC_YAMYAM], TEXT_SMASHING }, + { EL_YAMYAM_RIGHT, &level.score[SC_YAMYAM], TEXT_SMASHING }, + { EL_YAMYAM_UP, &level.score[SC_YAMYAM], TEXT_SMASHING }, + { EL_YAMYAM_DOWN, &level.score[SC_YAMYAM], TEXT_SMASHING }, + { EL_DARK_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING }, + { EL_ROBOT, &level.score[SC_ROBOT], TEXT_SMASHING }, + { EL_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_NUT, &level.score[SC_NUT], TEXT_CRACKING }, + { EL_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING }, + { EL_EM_DYNAMITE, &level.score[SC_DYNAMITE], TEXT_COLLECTING }, + { EL_DYNABOMB_INCREASE_NUMBER,&level.score[SC_DYNAMITE], TEXT_COLLECTING }, + { EL_DYNABOMB_INCREASE_SIZE, &level.score[SC_DYNAMITE], TEXT_COLLECTING }, + { EL_DYNABOMB_INCREASE_POWER, &level.score[SC_DYNAMITE], TEXT_COLLECTING }, + { EL_SHIELD_NORMAL, &level.score[SC_SHIELD], TEXT_COLLECTING }, + { EL_SHIELD_DEADLY, &level.score[SC_SHIELD], TEXT_COLLECTING }, + { EL_EXTRA_TIME, &level.extra_time_score, TEXT_COLLECTING }, + { EL_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EM_KEY_1, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EM_KEY_2, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EM_KEY_3, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EM_KEY_4, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EMC_KEY_5, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EMC_KEY_6, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EMC_KEY_7, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_EMC_KEY_8, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_DC_KEY_WHITE, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_MM_KETTLE, &level.score[SC_EMERALD], TEXT_COLLECTING }, + { EL_DF_CELL, &level.score[SC_EMERALD], TEXT_COLLECTING }, + { EL_MM_KEY, &level.score[SC_KEY], TEXT_COLLECTING }, + { EL_MM_LIGHTBALL, &level.score[SC_ELEM_BONUS], TEXT_COLLECTING }, + { EL_MM_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_MM_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_MM_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_MM_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_MM_PACMAN_DOWN, &level.score[SC_PACMAN], TEXT_SMASHING }, + { EL_AMOEBA_WET, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, + { EL_AMOEBA_DRY, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, + { EL_AMOEBA_FULL, &level.amoeba_speed, TEXT_AMOEBA_SPEED }, + { 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, + 0, 100 }, + { EL_BD_AMOEBA, &level.bd_amoeba_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, + 0, 100 }, + { EL_BD_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_ROBOT_WHEEL, &level.time_wheel, TEXT_DURATION }, + { EL_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION }, + { EL_DC_TIMEGATE_SWITCH, &level.time_timegate, TEXT_DURATION }, + { EL_LIGHT_SWITCH, &level.time_light, TEXT_DURATION }, + { 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, + -100, 100 }, + { 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 }, + { EL_GAME_OF_LIFE, &level.game_of_life[1], TEXT_GAME_OF_LIFE_2,0,8 }, + { EL_GAME_OF_LIFE, &level.game_of_life[2], TEXT_GAME_OF_LIFE_3,0,8 }, + { EL_GAME_OF_LIFE, &level.game_of_life[3], TEXT_GAME_OF_LIFE_4,0,8 }, + { EL_BIOMAZE, &level.biomaze[0], TEXT_GAME_OF_LIFE_1,0,8 }, + { EL_BIOMAZE, &level.biomaze[1], TEXT_GAME_OF_LIFE_2,0,8 }, + { EL_BIOMAZE, &level.biomaze[2], TEXT_GAME_OF_LIFE_3,0,8 }, + { EL_BIOMAZE, &level.biomaze[3], TEXT_GAME_OF_LIFE_4,0,8 }, + { EL_EMC_ANDROID, &level.android_move_time, TEXT_MOVE_SPEED }, + { EL_EMC_ANDROID, &level.android_clone_time, TEXT_CLONE_SPEED }, + { EL_EMC_MAGIC_BALL, &level.ball_time, TEXT_BALL_DELAY }, + { EL_EMC_LENSES, &level.lenses_score, TEXT_COLLECTING }, + { EL_EMC_MAGNIFIER, &level.magnify_score, TEXT_COLLECTING }, + { EL_SPRING, &level.slurp_score, TEXT_SLURPING }, + { EL_SPRING_LEFT, &level.slurp_score, TEXT_SLURPING }, + { EL_SPRING_RIGHT, &level.slurp_score, TEXT_SLURPING }, + { EL_EMC_LENSES, &level.lenses_time, TEXT_DURATION }, + { EL_EMC_MAGNIFIER, &level.magnify_time, TEXT_DURATION }, + { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse, TEXT_DELAY_OFF }, + { EL_MM_BOMB, &level.mm_time_bomb, TEXT_DELAY_EXPLODING }, + { EL_MM_GRAY_BALL, &level.mm_time_ball, TEXT_DELAY_CHANGING }, + { EL_MM_STEEL_BLOCK, &level.mm_time_block, TEXT_DELAY_MOVING }, + { EL_MM_WOODEN_BLOCK, &level.mm_time_block, TEXT_DELAY_MOVING }, + + { -1, NULL, NULL } }; static boolean checkPropertiesConfig(int element) @@ -10713,6 +10938,10 @@ 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) || @@ -10728,12 +10957,19 @@ static boolean checkPropertiesConfig(int element) HAS_EDITOR_CONTENT(element) || CAN_GROW(element) || COULD_MOVE_INTO_ACID(element) || - MAYBE_DONT_COLLIDE_WITH(element)) + MAYBE_DONT_COLLIDE_WITH(element) || + element == EL_BD_ROCK || + element == EL_BD_MEGA_ROCK || + element == EL_BD_SWEET) + { return TRUE; + } else + { for (i = 0; elements_with_counter[i].element != -1; i++) if (elements_with_counter[i].element == element) return TRUE; + } return FALSE; } @@ -10808,8 +11044,7 @@ static void DrawPropertiesConfig(void) int xpos = ED_ELEMENT_SETTINGS_X(0); int ypos = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; - PrintInfoText("No configuration options available.", - FONT_TEXT_1, xpos, ypos); + PrintInfoText("No configuration options available.", FONT_TEXT_1, xpos, ypos); return; } @@ -10817,41 +11052,56 @@ static void DrawPropertiesConfig(void) // check if there are elements where a value can be chosen for for (i = 0; elements_with_counter[i].element != -1; i++) { - if (elements_with_counter[i].element == properties_element) - { - 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_EMC_MAGIC_BALL ? 2 : 0) + - num_element_counters); - - counterbutton_info[counter_id].value = elements_with_counter[i].value; - counterbutton_info[counter_id].text_right = elements_with_counter[i].text; - - if (properties_element == EL_GAME_OF_LIFE || - properties_element == EL_BIOMAZE) - { - counterbutton_info[counter_id].min_value = 0; // min neighbours - counterbutton_info[counter_id].max_value = 8; // max neighbours - } - else - { - // !!! CHANGE THIS FOR CERTAIN ELEMENTS !!! - counterbutton_info[counter_id].min_value = MIN_SCORE; - counterbutton_info[counter_id].max_value = MAX_SCORE; - } + if (elements_with_counter[i].element != properties_element) + continue; - MapCounterButtons(counter_id); + // 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; - num_element_counters++; - if (num_element_counters >= max_num_element_counters) - break; - } + // 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: 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_EMC_MAGIC_BALL ? 2 : 0) + + num_element_counters); + + // 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); + + 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; + counterbutton_info[counter_id].max_value = elements_with_counter[i].max_value; + + // default: counter values between 0 and 999 + if (counterbutton_info[counter_id].max_value == 0) + counterbutton_info[counter_id].max_value = 999; + + MapCounterButtons(counter_id); + + num_element_counters++; + if (num_element_counters >= max_num_element_counters) + break; } if (HAS_EDITOR_CONTENT(properties_element)) @@ -10859,7 +11109,26 @@ static void DrawPropertiesConfig(void) // draw stickybutton gadget MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); - if (IS_AMOEBOID(properties_element)) + if (properties_element == EL_BD_AMOEBA && level.game_engine_type == GAME_ENGINE_TYPE_BD) + { + 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); + } + else if (properties_element == EL_BD_AMOEBA_2) + { + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA); + + MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_TOO_BIG); + MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_ENCLOSED); + MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_EXPLODING); + MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE); + } + else if (IS_AMOEBOID(properties_element)) MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT); else if (properties_element == EL_YAMYAM || properties_element == EL_YAMYAM_LEFT || @@ -10961,17 +11230,57 @@ static void DrawPropertiesConfig(void) } if (IS_BD_PLAYER_ELEMENT(properties_element)) + { + counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y = + ED_ELEMENT_SETTINGS_YPOS(2); + counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y = + ED_ELEMENT_SETTINGS_YPOS(3); + checkbutton_info[ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET].y = + ED_ELEMENT_SETTINGS_YPOS(4); + + // draw checkbutton gadgets MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET); - // 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) + // draw counter gadgets + MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB); + MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET); + } + + if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD) { - checkbutton_info[ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS].y = - ED_ELEMENT_SETTINGS_XPOS(properties_element == EL_BD_DIAMOND ? 2 : 1); + counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y = + ED_ELEMENT_SETTINGS_YPOS(0); + counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y = + ED_ELEMENT_SETTINGS_YPOS(1); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS); + MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB); + MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET); + } + + if (properties_element == EL_BD_MEGA_ROCK || + properties_element == EL_BD_SWEET) + { + counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y = + ED_ELEMENT_SETTINGS_YPOS(0); + checkbutton_info[ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET].y = + ED_ELEMENT_SETTINGS_YPOS(1); + + MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET); } + 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); + } + + // 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); + if (properties_element == EL_EM_DYNAMITE) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE); @@ -11006,7 +11315,7 @@ static void DrawPropertiesConfig(void) properties_element == EL_BIOMAZE) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_LIFE_BUGS); - if (CAN_GROW(properties_element)) + if (CAN_GROW(properties_element) && level.game_engine_type != GAME_ENGINE_TYPE_BD) { checkbutton_info[ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE].y = ED_ELEMENT_SETTINGS_YPOS(HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);