X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=14c5d86c88accd68a93fa004846995767b35e066;hb=5cbb24e1974b59f7580428768201b950423b88e2;hp=40265f5f9118a0912f3e24b275dc21c8ab79c89e;hpb=3a4b81ce19e6f0bab0c01db44bd7e815f4f6f1be;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 40265f5f..14c5d86c 100644 --- a/src/editor.c +++ b/src/editor.c @@ -429,6 +429,24 @@ enum GADGET_ID_LEVELSET_NUM_LEVELS_DOWN, GADGET_ID_LEVELSET_NUM_LEVELS_TEXT, GADGET_ID_LEVELSET_NUM_LEVELS_UP, + GADGET_ID_BD_CYCLE_DELAY_MS_DOWN, + GADGET_ID_BD_CYCLE_DELAY_MS_TEXT, + GADGET_ID_BD_CYCLE_DELAY_MS_UP, + 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, @@ -538,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, @@ -571,6 +595,7 @@ 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_WIND_DIRECTION, GADGET_ID_PLAYER_SPEED, @@ -606,6 +631,7 @@ enum GADGET_ID_LEVELCONFIG_LEVEL, GADGET_ID_LEVELCONFIG_LEVELSET, GADGET_ID_LEVELCONFIG_EDITOR, + GADGET_ID_LEVELCONFIG_ENGINE, GADGET_ID_PROPERTIES_INFO, GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_PROPERTIES_CONFIG_1, @@ -648,6 +674,12 @@ enum GADGET_ID_RANDOM_PERCENTAGE, GADGET_ID_RANDOM_QUANTITY, 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, @@ -679,6 +711,14 @@ enum GADGET_ID_CAN_FALL_INTO_ACID, 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, @@ -747,6 +787,12 @@ enum ED_COUNTER_ID_LEVEL_RANDOM_SEED, ED_COUNTER_ID_LEVELSET_NUM_LEVELS, 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, @@ -861,6 +907,7 @@ 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_WIND_DIRECTION, ED_SELECTBOX_ID_PLAYER_SPEED, @@ -900,6 +947,9 @@ enum #define ED_SELECTBOX_ID_LEVELSET_FIRST ED_SELECTBOX_ID_LEVELSET_SAVE_MODE #define ED_SELECTBOX_ID_LEVELSET_LAST ED_SELECTBOX_ID_LEVELSET_SAVE_MODE +#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_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 @@ -916,6 +966,7 @@ enum ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL, ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET, ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR, + ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE, ED_TEXTBUTTON_ID_PROPERTIES_INFO, ED_TEXTBUTTON_ID_PROPERTIES_CONFIG, ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1, @@ -931,7 +982,7 @@ enum }; #define ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL -#define ED_TAB_BUTTON_ID_LEVELCONFIG_LAST ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR +#define ED_TAB_BUTTON_ID_LEVELCONFIG_LAST ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE #define ED_TAB_BUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO #define ED_TAB_BUTTON_ID_PROPERTIES_LAST ED_TEXTBUTTON_ID_PROPERTIES_CHANGE @@ -963,6 +1014,12 @@ enum ED_CHECKBUTTON_ID_RANDOM_RESTRICTED, ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3, 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, @@ -994,6 +1051,14 @@ enum ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID, 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, @@ -1042,6 +1107,9 @@ enum #define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED #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_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 #define ED_CHECKBUTTON_ID_CUSTOM2_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE @@ -1086,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, @@ -1134,6 +1208,7 @@ enum #define ED_MODE_LEVELCONFIG_LEVEL ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL #define ED_MODE_LEVELCONFIG_LEVELSET ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET #define ED_MODE_LEVELCONFIG_EDITOR ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR +#define ED_MODE_LEVELCONFIG_ENGINE ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE // sub-screens in the element properties section #define ED_MODE_PROPERTIES_INFO ED_TEXTBUTTON_ID_PROPERTIES_INFO @@ -1376,6 +1451,7 @@ static int levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE; static struct { + int gadget_type_id; int x, y; int min_value, max_value; int gadget_id_down, gadget_id_up; @@ -1388,6 +1464,7 @@ static struct // ---------- current level number ------------------------------------------ { + ED_COUNTER_ID_SELECT_LEVEL, -1, -1, // these values are not constant, but can change at runtime 1, 100, GADGET_ID_SELECT_LEVEL_DOWN, GADGET_ID_SELECT_LEVEL_UP, @@ -1399,6 +1476,7 @@ static struct // ---------- level and editor settings ------------------------------------- { + ED_COUNTER_ID_LEVEL_XSIZE, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4), MIN_LEV_FIELDX, MAX_LEV_FIELDX, GADGET_ID_LEVEL_XSIZE_DOWN, GADGET_ID_LEVEL_XSIZE_UP, @@ -1407,6 +1485,7 @@ static struct "playfield size:", NULL, "width", }, { + ED_COUNTER_ID_LEVEL_YSIZE, -1, ED_LEVEL_SETTINGS_YPOS(4), MIN_LEV_FIELDY, MAX_LEV_FIELDY, GADGET_ID_LEVEL_YSIZE_DOWN, GADGET_ID_LEVEL_YSIZE_UP, @@ -1415,6 +1494,7 @@ static struct NULL, " ", "height", }, { + ED_COUNTER_ID_LEVEL_GEMSLIMIT, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(5), 0, 999, GADGET_ID_LEVEL_GEMSLIMIT_DOWN, GADGET_ID_LEVEL_GEMSLIMIT_UP, @@ -1423,6 +1503,7 @@ static struct NULL, "number of gems to collect:", NULL }, { + ED_COUNTER_ID_LEVEL_TIMELIMIT, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(8), 0, 9999, GADGET_ID_LEVEL_TIMELIMIT_DOWN, GADGET_ID_LEVEL_TIMELIMIT_UP, @@ -1431,6 +1512,7 @@ static struct "time or step limit to solve level:", NULL, NULL }, { + ED_COUNTER_ID_LEVEL_TIMESCORE, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10), 0, 999, GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP, @@ -1439,6 +1521,7 @@ static struct "score for time or steps left:", NULL, NULL }, { + ED_COUNTER_ID_LEVEL_RANDOM_SEED, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(13), 0, 9999, GADGET_ID_LEVEL_RANDOM_SEED_DOWN, GADGET_ID_LEVEL_RANDOM_SEED_UP, @@ -1447,6 +1530,7 @@ static struct NULL, "random seed:", "(0 => random)" }, { + ED_COUNTER_ID_LEVELSET_NUM_LEVELS, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4), 1, MAX_LEVELS, GADGET_ID_LEVELSET_NUM_LEVELS_DOWN, GADGET_ID_LEVELSET_NUM_LEVELS_UP, @@ -1455,6 +1539,7 @@ static struct "number of levels:", NULL, NULL, }, { + ED_COUNTER_ID_LEVEL_RANDOM, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0), 1, 100, GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP, @@ -1462,10 +1547,65 @@ static struct &random_placement_value, "random element placement:", NULL, "in" }, + { + ED_COUNTER_ID_BD_CYCLE_DELAY_MS, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(3), + 50, 500, + GADGET_ID_BD_CYCLE_DELAY_MS_DOWN, GADGET_ID_BD_CYCLE_DELAY_MS_UP, + GADGET_ID_BD_CYCLE_DELAY_MS_TEXT, GADGET_ID_NONE, + &level.bd_cycle_delay_ms, + NULL, NULL, "game cycle delay (ms)" + }, + { + ED_COUNTER_ID_BD_CYCLE_DELAY_C64, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(3), + 0, 32, + GADGET_ID_BD_CYCLE_DELAY_C64_DOWN, GADGET_ID_BD_CYCLE_DELAY_C64_UP, + GADGET_ID_BD_CYCLE_DELAY_C64_TEXT, GADGET_ID_NONE, + &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), MIN_SCORE, MAX_SCORE, GADGET_ID_ELEMENT_VALUE1_DOWN, GADGET_ID_ELEMENT_VALUE1_UP, @@ -1474,6 +1614,7 @@ static struct NULL, NULL, NULL }, { + ED_COUNTER_ID_ELEMENT_VALUE2, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), MIN_SCORE, MAX_SCORE, GADGET_ID_ELEMENT_VALUE2_DOWN, GADGET_ID_ELEMENT_VALUE2_UP, @@ -1482,6 +1623,7 @@ static struct NULL, NULL, NULL }, { + ED_COUNTER_ID_ELEMENT_VALUE3, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), MIN_SCORE, MAX_SCORE, GADGET_ID_ELEMENT_VALUE3_DOWN, GADGET_ID_ELEMENT_VALUE3_UP, @@ -1490,6 +1632,7 @@ static struct NULL, NULL, NULL }, { + ED_COUNTER_ID_ELEMENT_VALUE4, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), MIN_SCORE, MAX_SCORE, GADGET_ID_ELEMENT_VALUE4_DOWN, GADGET_ID_ELEMENT_VALUE4_UP, @@ -1498,6 +1641,7 @@ static struct NULL, NULL, NULL }, { + ED_COUNTER_ID_YAMYAM_CONTENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), MIN_ELEMENT_CONTENTS, MAX_ELEMENT_CONTENTS, GADGET_ID_YAMYAM_CONTENT_DOWN, GADGET_ID_YAMYAM_CONTENT_UP, @@ -1506,6 +1650,7 @@ static struct NULL, NULL, "number of content areas" }, { + ED_COUNTER_ID_BALL_CONTENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), MIN_ELEMENT_CONTENTS, MAX_ELEMENT_CONTENTS, GADGET_ID_BALL_CONTENT_DOWN, GADGET_ID_BALL_CONTENT_UP, @@ -1514,6 +1659,7 @@ static struct NULL, NULL, "number of content areas" }, { + ED_COUNTER_ID_ANDROID_CONTENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), MIN_ANDROID_ELEMENTS, MAX_ANDROID_ELEMENTS, GADGET_ID_ANDROID_CONTENT_DOWN, GADGET_ID_ANDROID_CONTENT_UP, @@ -1522,6 +1668,7 @@ static struct NULL, NULL, "number of clonable elements" }, { + ED_COUNTER_ID_ENVELOPE_XSIZE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), MIN_ENVELOPE_XSIZE, MAX_ENVELOPE_XSIZE, GADGET_ID_ENVELOPE_XSIZE_DOWN, GADGET_ID_ENVELOPE_XSIZE_UP, @@ -1530,6 +1677,7 @@ static struct NULL, NULL, "width", }, { + ED_COUNTER_ID_ENVELOPE_YSIZE, -1, ED_ELEMENT_SETTINGS_YPOS(0), MIN_ENVELOPE_YSIZE, MAX_ENVELOPE_YSIZE, GADGET_ID_ENVELOPE_YSIZE_DOWN, GADGET_ID_ENVELOPE_YSIZE_UP, @@ -1538,6 +1686,7 @@ static struct NULL, " ", "height", }, { + ED_COUNTER_ID_INVENTORY_SIZE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), MIN_INITIAL_INVENTORY_SIZE, MAX_INITIAL_INVENTORY_SIZE, GADGET_ID_INVENTORY_SIZE_DOWN, GADGET_ID_INVENTORY_SIZE_UP, @@ -1546,6 +1695,7 @@ static struct NULL, NULL, "number of inventory elements" }, { + ED_COUNTER_ID_MM_BALL_CONTENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), MIN_ELEMENTS_IN_GROUP, MAX_MM_BALL_CONTENTS, GADGET_ID_MM_BALL_CONTENT_DOWN, GADGET_ID_MM_BALL_CONTENT_UP, @@ -1557,6 +1707,7 @@ static struct // ---------- element settings: configure 1 (custom elements) --------------- { + ED_COUNTER_ID_CUSTOM_SCORE, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5), MIN_SCORE, MAX_SCORE, GADGET_ID_CUSTOM_SCORE_DOWN, GADGET_ID_CUSTOM_SCORE_UP, @@ -1565,6 +1716,7 @@ static struct NULL, "CE score", " " }, { + ED_COUNTER_ID_CUSTOM_GEMCOUNT, -1, ED_ELEMENT_SETTINGS_YPOS(5), MIN_COLLECT_COUNT, MAX_COLLECT_COUNT, GADGET_ID_CUSTOM_GEMCOUNT_DOWN, GADGET_ID_CUSTOM_GEMCOUNT_UP, @@ -1573,6 +1725,7 @@ static struct NULL, "CE count", NULL }, { + ED_COUNTER_ID_CUSTOM_VALUE_FIX, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), 0, 9999, GADGET_ID_CUSTOM_VALUE_FIX_DOWN, GADGET_ID_CUSTOM_VALUE_FIX_UP, @@ -1581,6 +1734,7 @@ static struct NULL, "CE value", NULL }, { + ED_COUNTER_ID_CUSTOM_VALUE_RND, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), 0, 9999, GADGET_ID_CUSTOM_VALUE_RND_DOWN, GADGET_ID_CUSTOM_VALUE_RND_UP, @@ -1589,6 +1743,7 @@ static struct NULL, "+random", NULL }, { + ED_COUNTER_ID_PUSH_DELAY_FIX, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(6), 0, 999, GADGET_ID_PUSH_DELAY_FIX_DOWN, GADGET_ID_PUSH_DELAY_FIX_UP, @@ -1597,6 +1752,7 @@ static struct NULL, "push delay", NULL }, { + ED_COUNTER_ID_PUSH_DELAY_RND, -1, ED_ELEMENT_SETTINGS_YPOS(6), 0, 999, GADGET_ID_PUSH_DELAY_RND_DOWN, GADGET_ID_PUSH_DELAY_RND_UP, @@ -1605,6 +1761,7 @@ static struct NULL, "+random", NULL }, { + ED_COUNTER_ID_DROP_DELAY_FIX, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(7), 0, 999, GADGET_ID_DROP_DELAY_FIX_DOWN, GADGET_ID_DROP_DELAY_FIX_UP, @@ -1613,6 +1770,7 @@ static struct NULL, "drop delay", NULL }, { + ED_COUNTER_ID_DROP_DELAY_RND, -1, ED_ELEMENT_SETTINGS_YPOS(7), 0, 999, GADGET_ID_DROP_DELAY_RND_DOWN, GADGET_ID_DROP_DELAY_RND_UP, @@ -1624,6 +1782,7 @@ static struct // ---------- element settings: configure 2 (custom elements) --------------- { + ED_COUNTER_ID_MOVE_DELAY_FIX, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5), 0, 999, GADGET_ID_MOVE_DELAY_FIX_DOWN, GADGET_ID_MOVE_DELAY_FIX_UP, @@ -1632,6 +1791,7 @@ static struct NULL, "move delay", NULL }, { + ED_COUNTER_ID_MOVE_DELAY_RND, -1, ED_ELEMENT_SETTINGS_YPOS(5), 0, 999, GADGET_ID_MOVE_DELAY_RND_DOWN, GADGET_ID_MOVE_DELAY_RND_UP, @@ -1640,6 +1800,7 @@ static struct NULL, "+random", NULL }, { + ED_COUNTER_ID_STEP_DELAY_FIX, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(6), 0, 999, GADGET_ID_STEP_DELAY_FIX_DOWN, GADGET_ID_STEP_DELAY_FIX_UP, @@ -1648,6 +1809,7 @@ static struct NULL, "step delay", NULL }, { + ED_COUNTER_ID_STEP_DELAY_RND, -1, ED_ELEMENT_SETTINGS_YPOS(6), 0, 999, GADGET_ID_STEP_DELAY_RND_DOWN, GADGET_ID_STEP_DELAY_RND_UP, @@ -1656,6 +1818,7 @@ static struct NULL, "+random", NULL }, { + ED_COUNTER_ID_EXPLOSION_DELAY, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13), 0, 999, GADGET_ID_EXPLOSION_DELAY_DOWN, GADGET_ID_EXPLOSION_DELAY_UP, @@ -1664,6 +1827,7 @@ static struct NULL, "explosion delay", NULL }, { + ED_COUNTER_ID_IGNITION_DELAY, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(14), 0, 999, GADGET_ID_IGNITION_DELAY_DOWN, GADGET_ID_IGNITION_DELAY_UP, @@ -1675,6 +1839,7 @@ static struct // ---------- element settings: configure (group elements) ------------------ { + ED_COUNTER_ID_GROUP_CONTENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), MIN_ELEMENTS_IN_GROUP, MAX_ELEMENTS_IN_GROUP, GADGET_ID_GROUP_CONTENT_DOWN, GADGET_ID_GROUP_CONTENT_UP, @@ -1686,6 +1851,7 @@ static struct // ---------- element settings: advanced (custom elements) ------------------ { + ED_COUNTER_ID_CHANGE_DELAY_FIX, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(2), 0, 999, GADGET_ID_CHANGE_DELAY_FIX_DOWN, GADGET_ID_CHANGE_DELAY_FIX_UP, @@ -1694,6 +1860,7 @@ static struct NULL, "CE delay", NULL, }, { + ED_COUNTER_ID_CHANGE_DELAY_RND, -1, ED_ELEMENT_SETTINGS_YPOS(2), 0, 999, GADGET_ID_CHANGE_DELAY_RND_DOWN, GADGET_ID_CHANGE_DELAY_RND_UP, @@ -1702,6 +1869,7 @@ static struct NULL, "+random", NULL }, { + ED_COUNTER_ID_CHANGE_CONT_RND, ED_ELEMENT_SETTINGS_XPOS(3), ED_ELEMENT_SETTINGS_YPOS(12), 0, 100, GADGET_ID_CHANGE_CONT_RND_DOWN, GADGET_ID_CHANGE_CONT_RND_UP, @@ -1713,6 +1881,7 @@ static struct static struct { + int gadget_type_id; int x, y; int gadget_id; int size; @@ -1721,6 +1890,7 @@ static struct } textinput_info[ED_NUM_TEXTINPUT] = { { + ED_TEXTINPUT_ID_LEVEL_NAME, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0), GADGET_ID_LEVEL_NAME, MAX_LEVEL_NAME_LEN, @@ -1728,6 +1898,7 @@ static struct "Title:", "Title for this level" }, { + ED_TEXTINPUT_ID_LEVEL_AUTHOR, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(2), GADGET_ID_LEVEL_AUTHOR, MAX_LEVEL_AUTHOR_LEN, @@ -1735,6 +1906,7 @@ static struct "Author:", "Author for this level" }, { + ED_TEXTINPUT_ID_LEVELSET_NAME, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0), GADGET_ID_LEVELSET_NAME, MAX_LEVEL_NAME_LEN, @@ -1742,6 +1914,7 @@ static struct "Title:", "Title for this or new level set" }, { + ED_TEXTINPUT_ID_LEVELSET_AUTHOR, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(2), GADGET_ID_LEVELSET_AUTHOR, MAX_LEVEL_AUTHOR_LEN, @@ -1749,6 +1922,7 @@ static struct "Author:", "Author for this or new level set" }, { + 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 @@ -1759,6 +1933,7 @@ static struct static struct { + int gadget_type_id; int x, y; int gadget_id; int xsize, ysize; @@ -1767,6 +1942,7 @@ static struct } textarea_info[ED_NUM_TEXTAREAS] = { { + ED_TEXTAREA_ID_ENVELOPE_INFO, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_ENVELOPE_INFO, MAX_ENVELOPE_XSIZE, MAX_ENVELOPE_YSIZE, @@ -2471,6 +2647,19 @@ static struct ValueTextInfo options_group_choice_mode[] = { -1, NULL } }; +static struct ValueTextInfo options_bd_scheduling_type[] = +{ + { GD_SCHEDULING_MILLISECONDS, "Milliseconds" }, + { GD_SCHEDULING_BD1, "BD1" }, + { GD_SCHEDULING_BD2, "BD2" }, + { GD_SCHEDULING_PLCK, "Construction Kit" }, + { GD_SCHEDULING_CRDR, "Crazy Dream 7" }, + { GD_SCHEDULING_BD1_ATARI, "Atari BD1" }, + { GD_SCHEDULING_BD2_PLCK_ATARI, "Atari BD2 / PLCK" }, + + { -1, NULL } +}; + static struct ValueTextInfo *action_arg_modes[] = { options_action_mode_none, @@ -2515,6 +2704,7 @@ action_arg_options[] = static struct { + int gadget_type_id; int x, y; int gadget_id; int gadget_id_align; @@ -2527,6 +2717,7 @@ static struct // ---------- level and editor settings ------------------------------------- { + ED_SELECTBOX_ID_TIME_OR_STEPS, -1, ED_LEVEL_SETTINGS_YPOS(8), GADGET_ID_TIME_OR_STEPS, GADGET_ID_LEVEL_TIMELIMIT_UP, -1, @@ -2535,6 +2726,7 @@ static struct NULL, NULL, "(0 => no limit)", "time or step limit" }, { + ED_SELECTBOX_ID_TIME_SCORE_BASE, -1, ED_LEVEL_SETTINGS_YPOS(10), GADGET_ID_TIME_SCORE_BASE, GADGET_ID_LEVEL_TIMESCORE_UP, -1, @@ -2543,6 +2735,7 @@ static struct NULL, NULL, NULL, "time score for 1 or 10 seconds/steps" }, { + ED_SELECTBOX_ID_GAME_ENGINE_TYPE, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(12), GADGET_ID_GAME_ENGINE_TYPE, GADGET_ID_NONE, -1, @@ -2551,6 +2744,16 @@ static struct NULL, "game engine:", NULL, "game engine" }, { + ED_SELECTBOX_ID_BD_SCHEDULING_TYPE, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(1), + GADGET_ID_BD_SCHEDULING_TYPE, GADGET_ID_NONE, + -1, + options_bd_scheduling_type, + &level.bd_scheduling_type, + NULL, "scheduling type:", NULL, "level timing" + }, + { + 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, @@ -2562,6 +2765,7 @@ static struct // ---------- element settings: configure (several elements) ---------------- { + ED_SELECTBOX_ID_WIND_DIRECTION, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_WIND_DIRECTION, GADGET_ID_NONE, -1, @@ -2570,6 +2774,7 @@ static struct NULL, "initial wind direction:", NULL, "initial wind direction" }, { + ED_SELECTBOX_ID_PLAYER_SPEED, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7), GADGET_ID_PLAYER_SPEED, GADGET_ID_NONE, -1, @@ -2578,6 +2783,7 @@ static struct NULL, "initial player speed:", NULL, "initial player speed" }, { + ED_SELECTBOX_ID_MM_BALL_CHOICE_MODE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_MM_BALL_CHOICE_MODE, GADGET_ID_NONE, -1, @@ -2589,6 +2795,7 @@ static struct // ---------- element settings: configure 1 (custom elements) --------------- { + ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_CUSTOM_ACCESS_TYPE, GADGET_ID_NONE, -1, @@ -2597,6 +2804,7 @@ static struct NULL, NULL, NULL, "type of access to this field" }, { + ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER, -1, ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_CUSTOM_ACCESS_LAYER, GADGET_ID_CUSTOM_ACCESS_TYPE, -1, @@ -2605,6 +2813,7 @@ static struct NULL, NULL, NULL, "layer of access for this field" }, { + ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED, -1, ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_CUSTOM_ACCESS_PROTECTED, GADGET_ID_CUSTOM_ACCESS_LAYER, -1, @@ -2613,6 +2822,7 @@ static struct NULL, NULL, NULL, "protected access for this field" }, { + ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_CUSTOM_ACCESS_DIRECTION, GADGET_ID_NONE, -1, @@ -2621,6 +2831,7 @@ static struct NULL, "from", NULL, "access direction for this field" }, { + ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_CUSTOM_WALK_TO_ACTION, GADGET_ID_NONE, -1, @@ -2632,6 +2843,7 @@ static struct // ---------- element settings: configure 2 (custom elements) --------------- { + ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_MOVE_PATTERN, GADGET_ID_NONE, -1, @@ -2640,6 +2852,7 @@ static struct NULL, "can move", NULL, "element move pattern" }, { + ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_CUSTOM_MOVE_DIRECTION, GADGET_ID_NONE, -1, @@ -2648,6 +2861,7 @@ static struct NULL, "starts moving", NULL, "initial element move direction" }, { + ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_CUSTOM_MOVE_STEPSIZE, GADGET_ID_NONE, -1, @@ -2656,6 +2870,7 @@ static struct NULL, "move/fall speed", NULL, "speed of element movement" }, { + ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, GADGET_ID_NONE, -1, @@ -2667,6 +2882,7 @@ static struct NULL, " can", ":", "leave behind or change element" }, { + ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS, -1, ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH, -1, @@ -2675,6 +2891,7 @@ static struct NULL, "can smash", NULL, "elements that can be smashed" }, { + ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_SLIPPERY_TYPE, GADGET_ID_NONE, -1, @@ -2683,6 +2900,7 @@ static struct NULL, "slippery", NULL, "where other elements fall down" }, { + ED_SELECTBOX_ID_CUSTOM_DEADLINESS, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_DEADLINESS, GADGET_ID_NONE, -1, @@ -2691,6 +2909,7 @@ static struct NULL, "deadly when", NULL, "deadliness of element" }, { + ED_SELECTBOX_ID_CUSTOM_EXPLOSION_TYPE, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_EXPLOSION_TYPE, GADGET_ID_NONE, -1, @@ -2702,6 +2921,7 @@ static struct // ---------- element settings: advanced (custom elements) ------------------ { + ED_SELECTBOX_ID_CHANGE_TIME_UNITS, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_CHANGE_TIME_UNITS, GADGET_ID_NONE, -1, @@ -2710,6 +2930,7 @@ static struct NULL, "delay time given in", NULL, "delay time units for change" }, { + ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_CHANGE_DIRECT_ACTION, GADGET_ID_NONE, -1, @@ -2718,6 +2939,7 @@ static struct NULL, NULL, NULL, "type of direct action" }, { + ED_SELECTBOX_ID_CHANGE_OTHER_ACTION, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(5), GADGET_ID_CHANGE_OTHER_ACTION, GADGET_ID_NONE, -1, @@ -2726,6 +2948,7 @@ static struct NULL, NULL, "element:", "type of other element action" }, { + ED_SELECTBOX_ID_CHANGE_SIDE, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(6), GADGET_ID_CHANGE_SIDE, GADGET_ID_NONE, -1, @@ -2734,6 +2957,7 @@ static struct NULL, "at", "side", "element side triggering change" }, { + ED_SELECTBOX_ID_CHANGE_PLAYER, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(7), GADGET_ID_CHANGE_PLAYER, GADGET_ID_NONE, -1, @@ -2742,6 +2966,7 @@ static struct NULL, "player:", " ", "player that causes change" }, { + ED_SELECTBOX_ID_CHANGE_PAGE, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(7), GADGET_ID_CHANGE_PAGE, GADGET_ID_CHANGE_PLAYER, -1, @@ -2750,6 +2975,7 @@ static struct NULL, "page:", NULL, "change page that causes change" }, { + ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(10), GADGET_ID_CHANGE_REPLACE_WHEN, GADGET_ID_NONE, -1, @@ -2758,6 +2984,7 @@ static struct NULL, "replace when", NULL, "which elements can be replaced" }, { + ED_SELECTBOX_ID_ACTION_TYPE, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(13), GADGET_ID_ACTION_TYPE, GADGET_ID_NONE, 15, @@ -2766,6 +2993,7 @@ static struct NULL, NULL, NULL, "action on specified condition" }, { + ED_SELECTBOX_ID_ACTION_MODE, -1, ED_ELEMENT_SETTINGS_YPOS(13), GADGET_ID_ACTION_MODE, GADGET_ID_ACTION_TYPE, -1, @@ -2774,6 +3002,7 @@ static struct NULL, NULL, NULL, "action operator" }, { + ED_SELECTBOX_ID_ACTION_ARG, -1, ED_ELEMENT_SETTINGS_YPOS(13), GADGET_ID_ACTION_ARG, GADGET_ID_ACTION_MODE, -1, @@ -2782,6 +3011,7 @@ static struct NULL, NULL, NULL, "action parameter" }, { + ED_SELECTBOX_ID_SELECT_CHANGE_PAGE, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_SELECT_CHANGE_PAGE, GADGET_ID_NONE, 3, @@ -2793,6 +3023,7 @@ static struct // ---------- element settings: configure (group elements) ------------------ { + ED_SELECTBOX_ID_GROUP_CHOICE_MODE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_GROUP_CHOICE_MODE, GADGET_ID_NONE, -1, @@ -2804,6 +3035,7 @@ static struct static struct { + int gadget_type_id; int x, y; int gadget_id; int gadget_id_align; @@ -2815,51 +3047,66 @@ static struct // ---------- level and editor settings (tabs) ------------------------------ { + ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL, ED_LEVEL_TABS_XPOS(0), ED_LEVEL_TABS_YPOS(0), GADGET_ID_LEVELCONFIG_LEVEL, GADGET_ID_NONE, 8, "Level", NULL, NULL, NULL, "Configure level settings" }, { + ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET, -1, -1, GADGET_ID_LEVELCONFIG_LEVELSET, GADGET_ID_LEVELCONFIG_LEVEL, 8, "Levelset", NULL, NULL, NULL, "Update this or create new level set" }, { + ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR, -1, -1, GADGET_ID_LEVELCONFIG_EDITOR, GADGET_ID_LEVELCONFIG_LEVELSET, 8, "Editor", NULL, NULL, NULL, "Configure editor settings" }, + { + ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE, + -1, -1, + GADGET_ID_LEVELCONFIG_ENGINE, GADGET_ID_LEVELCONFIG_EDITOR, + 8, "Engine", + NULL, NULL, NULL, "Configure engine settings" + }, // ---------- element settings (tabs) --------------------------------------- { + ED_TEXTBUTTON_ID_PROPERTIES_INFO, ED_ELEMENT_TABS_XPOS(0), ED_ELEMENT_TABS_YPOS(0), GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE, 8, "Info", NULL, NULL, NULL, "Show information about element" }, { + ED_TEXTBUTTON_ID_PROPERTIES_CONFIG, -1, -1, GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_PROPERTIES_INFO, 8, "Config", NULL, NULL, NULL, "Configure element properties" }, { + ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1, -1, -1, GADGET_ID_PROPERTIES_CONFIG_1, GADGET_ID_PROPERTIES_INFO, 8, "Config 1", NULL, NULL, NULL, "Configure element properties, part 1" }, { + ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2, -1, -1, GADGET_ID_PROPERTIES_CONFIG_2, GADGET_ID_PROPERTIES_CONFIG_1, 8, "Config 2", NULL, NULL, NULL, "Configure element properties, part 2" }, { + ED_TEXTBUTTON_ID_PROPERTIES_CHANGE, -1, -1, GADGET_ID_PROPERTIES_CHANGE, GADGET_ID_PROPERTIES_CONFIG_2, 8, "Change", @@ -2869,12 +3116,14 @@ static struct // ---------- level and editor settings (buttons) --------------------------- { + ED_TEXTBUTTON_ID_SAVE_LEVELSET, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10), GADGET_ID_SAVE_LEVELSET, GADGET_ID_LEVELSET_SAVE_MODE, -1, "Save", NULL, NULL, NULL, "Update or create level set" }, { + ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(6), GADGET_ID_SAVE_AS_TEMPLATE_2, GADGET_ID_NONE, -1, "Save", @@ -2885,6 +3134,7 @@ static struct // ---------- element settings (buttons) ------------------------------------ { + ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1, -1, -1, GADGET_ID_SAVE_AS_TEMPLATE_1, GADGET_ID_CUSTOM_USE_TEMPLATE_1, -1, "Save", @@ -2892,12 +3142,14 @@ static struct "Save current settings as new template" }, { + ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE, -1, -1, GADGET_ID_ADD_CHANGE_PAGE, GADGET_ID_PASTE_CHANGE_PAGE, -1, "New", NULL, NULL, NULL, "Add new change page" }, { + ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE, -1, -1, GADGET_ID_DEL_CHANGE_PAGE, GADGET_ID_ADD_CHANGE_PAGE, -1, "Delete", @@ -2907,6 +3159,7 @@ static struct static struct { + int gadget_type_id; int graphic; int x, y; int gadget_id; @@ -2915,24 +3168,28 @@ static struct } graphicbutton_info[ED_NUM_GRAPHICBUTTONS] = { { + ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE, IMG_EDITOR_COUNTER_DOWN, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_PREV_CHANGE_PAGE, GADGET_ID_NONE, NULL, NULL, "select previous change page" }, { + ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE, IMG_EDITOR_COUNTER_UP, -1, ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_NEXT_CHANGE_PAGE, GADGET_ID_SELECT_CHANGE_PAGE, NULL, "change page", "select next change page" }, { + ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE, IMG_GFX_EDITOR_BUTTON_CP_COPY, -1, ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_COPY_CHANGE_PAGE, GADGET_ID_NEXT_CHANGE_PAGE, " ", NULL, "copy settings from this change page" }, { + ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE, IMG_GFX_EDITOR_BUTTON_CP_PASTE, -1, ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_PASTE_CHANGE_PAGE, GADGET_ID_COPY_CHANGE_PAGE, @@ -2947,37 +3204,44 @@ static struct static struct { + int gadget_type_id; int graphic; int gadget_id; char *infotext; } scrollbutton_info[ED_NUM_SCROLLBUTTONS] = { { + ED_SCROLLBUTTON_ID_AREA_UP, IMG_EDITOR_PLAYFIELD_SCROLL_UP, GADGET_ID_SCROLL_UP, "scroll level editing area up" }, { + ED_SCROLLBUTTON_ID_AREA_DOWN, IMG_EDITOR_PLAYFIELD_SCROLL_DOWN, GADGET_ID_SCROLL_DOWN, "scroll level editing area down" }, { + ED_SCROLLBUTTON_ID_AREA_LEFT, IMG_EDITOR_PLAYFIELD_SCROLL_LEFT, GADGET_ID_SCROLL_LEFT, "scroll level editing area left" }, { + ED_SCROLLBUTTON_ID_AREA_RIGHT, IMG_EDITOR_PLAYFIELD_SCROLL_RIGHT, GADGET_ID_SCROLL_RIGHT, "scroll level editing area right" }, { + ED_SCROLLBUTTON_ID_LIST_UP, IMG_EDITOR_PALETTE_SCROLL_UP, GADGET_ID_SCROLL_LIST_UP, "scroll element list up ('Page Up')" }, { + ED_SCROLLBUTTON_ID_LIST_DOWN, IMG_EDITOR_PALETTE_SCROLL_DOWN, GADGET_ID_SCROLL_LIST_DOWN, "scroll element list down ('Page Down')" @@ -2994,6 +3258,7 @@ static struct static struct { + int gadget_type_id; int graphic; int type; int gadget_id; @@ -3001,18 +3266,21 @@ static struct } scrollbar_info[ED_NUM_SCROLLBARS] = { { + ED_SCROLLBAR_ID_AREA_HORIZONTAL, IMG_EDITOR_PLAYFIELD_SCROLLBAR, GD_TYPE_SCROLLBAR_HORIZONTAL, GADGET_ID_SCROLL_HORIZONTAL, "scroll level editing area horizontally" }, { + ED_SCROLLBAR_ID_AREA_VERTICAL, IMG_EDITOR_PLAYFIELD_SCROLLBAR, GD_TYPE_SCROLLBAR_VERTICAL, GADGET_ID_SCROLL_VERTICAL, "scroll level editing area vertically" }, { + ED_SCROLLBAR_ID_LIST_VERTICAL, IMG_EDITOR_PALETTE_SCROLLBAR, GD_TYPE_SCROLLBAR_VERTICAL, GADGET_ID_SCROLL_LIST_VERTICAL, @@ -3023,6 +3291,7 @@ static struct static struct { + int gadget_type_id; int x, y; int gadget_id; int gadget_id_align; @@ -3033,6 +3302,7 @@ static struct } radiobutton_info[ED_NUM_RADIOBUTTONS] = { { + ED_RADIOBUTTON_ID_PERCENTAGE, -1, ED_LEVEL_SETTINGS_YPOS(0), GADGET_ID_RANDOM_PERCENTAGE, GADGET_ID_LEVEL_RANDOM_UP, RADIO_NR_RANDOM_ELEMENTS, @@ -3040,6 +3310,7 @@ static struct " ", "percentage", "use percentage for random elements" }, { + ED_RADIOBUTTON_ID_QUANTITY, -1, ED_LEVEL_SETTINGS_YPOS(0), GADGET_ID_RANDOM_QUANTITY, GADGET_ID_RANDOM_PERCENTAGE, RADIO_NR_RANDOM_ELEMENTS, @@ -3050,6 +3321,7 @@ static struct static struct { + int gadget_type_id; int x, y; int gadget_id; int gadget_id_align; @@ -3060,6 +3332,7 @@ static struct // ---------- level and editor settings ------------------------------------- { + ED_CHECKBUTTON_ID_AUTO_COUNT_GEMS, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(6), GADGET_ID_AUTO_COUNT_GEMS, GADGET_ID_NONE, &level.auto_count_gems, @@ -3067,6 +3340,7 @@ static struct "automatically count gems needed", "set counter to number of gems" }, { + ED_CHECKBUTTON_ID_RATE_TIME_OVER_SCORE, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(11), GADGET_ID_RATE_TIME_OVER_SCORE, GADGET_ID_NONE, &level.rate_time_over_score, @@ -3074,6 +3348,7 @@ static struct "rate time/steps used over score", "sort high scores by playing time/steps" }, { + ED_CHECKBUTTON_ID_USE_LEVELSET_ARTWORK, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(7), GADGET_ID_USE_LEVELSET_ARTWORK, GADGET_ID_NONE, &levelset_use_levelset_artwork, @@ -3081,6 +3356,7 @@ static struct "use current custom artwork", "use custom artwork of this level set" }, { + ED_CHECKBUTTON_ID_COPY_LEVEL_TEMPLATE, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(8), GADGET_ID_COPY_LEVEL_TEMPLATE, GADGET_ID_NONE, &levelset_copy_level_template, @@ -3088,6 +3364,7 @@ static struct "copy current level template", "copy level template of this level set" }, { + ED_CHECKBUTTON_ID_RANDOM_RESTRICTED, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(1), GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_NONE, &random_placement_background_restricted, @@ -3095,6 +3372,7 @@ static struct "restrict random placement to:", "set random placement restriction" }, { + ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4), GADGET_ID_CUSTOM_USE_TEMPLATE_3, GADGET_ID_NONE, &setup.editor.use_template_for_new_levels, @@ -3102,16 +3380,66 @@ static struct "use template for new levels", "use template for level properties" }, { + ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2, ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(5), GADGET_ID_CUSTOM_USE_TEMPLATE_2, GADGET_ID_NONE, &level.use_custom_template, NULL, NULL, "use template for custom elements", "use template for custom properties" }, + { + ED_CHECKBUTTON_ID_BD_INTERMISSION, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0), + GADGET_ID_BD_INTERMISSION, GADGET_ID_NONE, + &level.bd_intermission, + "Boulder Dash game engine settings:", NULL, + "intermission", "level is an intermission level" + }, + { + ED_CHECKBUTTON_ID_BD_PAL_TIMING, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(2), + GADGET_ID_BD_PAL_TIMING, GADGET_ID_NONE, + &level.bd_pal_timing, + 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) ---------------- { + ED_CHECKBUTTON_ID_STICK_ELEMENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_STICK_ELEMENT, GADGET_ID_NONE, &stick_element_properties_window, @@ -3119,6 +3447,7 @@ static struct "stick this screen to edit content","stick this screen to edit content" }, { + ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_EM_SLIPPERY_GEMS, GADGET_ID_NONE, &level.em_slippery_gems, @@ -3126,6 +3455,7 @@ static struct "slip down from certain flat walls","use EM/DC style slipping behaviour" }, { + ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_EM_EXPLODES_BY_FIRE, GADGET_ID_NONE, &level.em_explodes_by_fire, @@ -3133,6 +3463,7 @@ static struct "explodes with chain reaction", "use R'n'D style explosion behaviour" }, { + ED_CHECKBUTTON_ID_USE_SPRING_BUG, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_USE_SPRING_BUG, GADGET_ID_NONE, &level.use_spring_bug, @@ -3140,6 +3471,7 @@ static struct "use spring pushing bug", "use odd spring pushing behaviour" }, { + ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_USE_TIME_ORB_BUG, GADGET_ID_NONE, &level.use_time_orb_bug, @@ -3147,6 +3479,7 @@ static struct "use time orb bug", "use odd time orb behaviour" }, { + ED_CHECKBUTTON_ID_USE_LIFE_BUGS, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), GADGET_ID_USE_LIFE_BUGS, GADGET_ID_NONE, &level.use_life_bugs, @@ -3154,6 +3487,7 @@ static struct "use buggy element behaviour", "use odd (historic) element behaviour" }, { + ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_RANDOM_BALL_CONTENT, GADGET_ID_NONE, &level.ball_random, @@ -3161,6 +3495,7 @@ static struct "create single random element", "only create one element from content" }, { + ED_CHECKBUTTON_ID_INITIAL_BALL_ACTIVE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_INITIAL_BALL_ACTIVE, GADGET_ID_NONE, &level.ball_active_initial, @@ -3168,6 +3503,7 @@ static struct "magic ball initially activated", "activate magic ball after level start" }, { + ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_GROW_INTO_DIGGABLE, GADGET_ID_NONE, &level.grow_into_diggable, @@ -3175,6 +3511,7 @@ static struct "can grow into anything diggable", "grow into more than just sand" }, { + ED_CHECKBUTTON_ID_SB_FIELDS_NEEDED, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_SB_FIELDS_NEEDED, GADGET_ID_NONE, &level.sb_fields_needed, @@ -3182,6 +3519,7 @@ static struct "all fields need to be filled", "require all SB fields to be solved" }, { + ED_CHECKBUTTON_ID_SB_OBJECTS_NEEDED, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_SB_OBJECTS_NEEDED, GADGET_ID_NONE, &level.sb_objects_needed, @@ -3189,6 +3527,7 @@ static struct "all objects need to be placed", "require all SB objects to be solved" }, { + ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_AUTO_EXIT_SOKOBAN, GADGET_ID_NONE, &level.auto_exit_sokoban, @@ -3196,6 +3535,7 @@ static struct "exit level if all tasks solved", "automatically finish Sokoban levels" }, { + ED_CHECKBUTTON_ID_SOLVED_BY_ONE_PLAYER, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_SOLVED_BY_ONE_PLAYER, GADGET_ID_NONE, &level.solved_by_one_player, @@ -3203,6 +3543,7 @@ static struct "only one player must enter exit", "level solved by first player in exit" }, { + ED_CHECKBUTTON_ID_FINISH_DIG_COLLECT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_FINISH_DIG_COLLECT, GADGET_ID_NONE, &level.finish_dig_collect, @@ -3210,6 +3551,7 @@ static struct "CE action on finished dig/collect", "only finished dig/collect triggers CE" }, { + ED_CHECKBUTTON_ID_KEEP_WALKABLE_CE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_KEEP_WALKABLE_CE, GADGET_ID_NONE, &level.keep_walkable_ce, @@ -3217,6 +3559,7 @@ static struct "keep walkable CE changed to player", "keep CE changing to player if walkable" }, { + ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CONTINUOUS_SNAPPING, GADGET_ID_NONE, &level.continuous_snapping, @@ -3224,6 +3567,7 @@ static struct "continuous snapping", "use snapping without releasing key" }, { + ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_BLOCK_SNAP_FIELD, GADGET_ID_NONE, &level.block_snap_field, @@ -3231,6 +3575,7 @@ static struct "block snapped field when snapping", "use snapping delay to show animation" }, { + ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_BLOCK_LAST_FIELD, GADGET_ID_NONE, &level.block_last_field, @@ -3238,6 +3583,7 @@ static struct "block last field when moving", "player blocks last field when moving" }, { + ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_SP_BLOCK_LAST_FIELD, GADGET_ID_NONE, &level.sp_block_last_field, @@ -3245,6 +3591,7 @@ static struct "block last field when moving", "player blocks last field when moving" }, { + ED_CHECKBUTTON_ID_INSTANT_RELOCATION, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_INSTANT_RELOCATION, GADGET_ID_NONE, &level.instant_relocation, @@ -3252,6 +3599,7 @@ static struct "no scrolling when relocating", "player gets relocated without delay" }, { + ED_CHECKBUTTON_ID_SHIFTED_RELOCATION, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_SHIFTED_RELOCATION, GADGET_ID_NONE, &level.shifted_relocation, @@ -3259,6 +3607,7 @@ static struct "no centering when relocating", "level not centered after relocation" }, { + ED_CHECKBUTTON_ID_LAZY_RELOCATION, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), GADGET_ID_LAZY_RELOCATION, GADGET_ID_NONE, &level.lazy_relocation, @@ -3266,6 +3615,7 @@ static struct "only redraw off-screen relocation","no redraw if relocation target visible" }, { + ED_CHECKBUTTON_ID_USE_START_ELEMENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), GADGET_ID_USE_START_ELEMENT, GADGET_ID_NONE, &level.use_start_element[0], @@ -3273,6 +3623,7 @@ static struct "use level start element:", "start level at this element's position" }, { + ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_USE_ARTWORK_ELEMENT, GADGET_ID_NONE, &level.use_artwork_element[0], @@ -3280,6 +3631,7 @@ static struct "use artwork from element:", "use player artwork from other element" }, { + ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_USE_EXPLOSION_ELEMENT, GADGET_ID_NONE, &level.use_explosion_element[0], @@ -3287,6 +3639,7 @@ static struct "use explosion from element:", "use explosion properties from element" }, { + ED_CHECKBUTTON_ID_INITIAL_GRAVITY, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13), GADGET_ID_INITIAL_GRAVITY, GADGET_ID_NONE, &level.initial_player_gravity[0], @@ -3294,6 +3647,7 @@ static struct "use initial gravity", "set initial player gravity" }, { + ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_USE_INITIAL_INVENTORY, GADGET_ID_NONE, &level.use_initial_inventory[0], @@ -3301,6 +3655,7 @@ static struct "use initial inventory:", "use collected elements on level start" }, { + ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6), GADGET_ID_CAN_PASS_TO_WALKABLE, GADGET_ID_NONE, &level.can_pass_to_walkable, @@ -3308,6 +3663,7 @@ static struct "can pass to walkable element", "player can pass to empty or walkable" }, { + ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CAN_FALL_INTO_ACID, GADGET_ID_NONE, &custom_element_properties[EP_CAN_MOVE_INTO_ACID], @@ -3315,6 +3671,7 @@ static struct "can fall into acid (with gravity)","player can fall into acid pool" }, { + ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_CAN_MOVE_INTO_ACID, GADGET_ID_NONE, &custom_element_properties[EP_CAN_MOVE_INTO_ACID], @@ -3322,6 +3679,7 @@ static struct "can move into acid", "element can move into acid pool" }, { + ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_DONT_COLLIDE_WITH, GADGET_ID_NONE, &custom_element_properties[EP_DONT_COLLIDE_WITH], @@ -3329,6 +3687,71 @@ static struct "deadly when colliding with", "element is deadly when hitting player" }, { + ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), + GADGET_ID_BD_DIAGONAL_MOVEMENTS, GADGET_ID_NONE, + &level.bd_diagonal_movements, + 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), GADGET_ID_ENVELOPE_AUTOWRAP, GADGET_ID_NONE, &level.envelope[0].autowrap, @@ -3336,6 +3759,7 @@ static struct "auto-wrap", "automatically wrap envelope text" }, { + ED_CHECKBUTTON_ID_ENVELOPE_CENTERED, -1, ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_ENVELOPE_CENTERED, GADGET_ID_ENVELOPE_AUTOWRAP, &level.envelope[0].centered, @@ -3343,6 +3767,7 @@ static struct "centered", "automatically center envelope text" }, { + ED_CHECKBUTTON_ID_MM_LASER_RED, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_MM_LASER_RED, GADGET_ID_NONE, &level.mm_laser_red, @@ -3350,6 +3775,7 @@ static struct "red", "use red color components in laser" }, { + ED_CHECKBUTTON_ID_MM_LASER_GREEN, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_MM_LASER_GREEN, GADGET_ID_NONE, &level.mm_laser_green, @@ -3357,6 +3783,7 @@ static struct "green", "use green color components in laser" }, { + ED_CHECKBUTTON_ID_MM_LASER_BLUE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_MM_LASER_BLUE, GADGET_ID_NONE, &level.mm_laser_blue, @@ -3364,6 +3791,7 @@ static struct "blue", "use blue color components in laser" }, { + ED_CHECKBUTTON_ID_DF_LASER_RED, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_DF_LASER_RED, GADGET_ID_NONE, &level.df_laser_red, @@ -3371,6 +3799,7 @@ static struct "red", "use red color components in laser" }, { + ED_CHECKBUTTON_ID_DF_LASER_GREEN, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_DF_LASER_GREEN, GADGET_ID_NONE, &level.df_laser_green, @@ -3378,6 +3807,7 @@ static struct "green", "use green color components in laser" }, { + ED_CHECKBUTTON_ID_DF_LASER_BLUE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_DF_LASER_BLUE, GADGET_ID_NONE, &level.df_laser_blue, @@ -3385,6 +3815,7 @@ static struct "blue", "use blue color components in laser" }, { + ED_CHECKBUTTON_ID_ROTATE_MM_BALL_CONTENT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), GADGET_ID_ROTATE_MM_BALL_CONTENT, GADGET_ID_NONE, &level.rotate_mm_ball_content, @@ -3392,6 +3823,7 @@ static struct "randomly rotate created content", "randomly rotate newly created content" }, { + ED_CHECKBUTTON_ID_EXPLODE_MM_BALL, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6), GADGET_ID_EXPLODE_MM_BALL, GADGET_ID_NONE, &level.explode_mm_ball, @@ -3402,6 +3834,7 @@ static struct // ---------- element settings: configure 1 (custom elements) --------------- { + ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_USE_GRAPHIC, GADGET_ID_NONE, &custom_element.use_gfx_element, @@ -3409,6 +3842,7 @@ static struct "use graphic of element:", "use existing element graphic" }, { + ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_CUSTOM_USE_TEMPLATE_1, GADGET_ID_NONE, &level.use_custom_template, @@ -3416,6 +3850,7 @@ static struct "use template", "use template for custom properties" }, { + ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_CUSTOM_ACCESSIBLE, GADGET_ID_NONE, &custom_element_properties[EP_ACCESSIBLE], @@ -3423,6 +3858,7 @@ static struct NULL, "player can walk to or pass this field" }, { + ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_GRAV_REACHABLE, GADGET_ID_NONE, &custom_element_properties[EP_GRAVITY_REACHABLE], @@ -3430,6 +3866,7 @@ static struct "reachable despite gravity", "player can walk/dig despite gravity" }, { + ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_USE_LAST_VALUE, GADGET_ID_NONE, &custom_element.use_last_ce_value, @@ -3437,6 +3874,7 @@ static struct "use last CE value after change", "use last CE value after change" }, { + ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_CUSTOM_WALK_TO_OBJECT, GADGET_ID_NONE, &custom_element_properties[EP_WALK_TO_OBJECT], @@ -3444,6 +3882,7 @@ static struct NULL, "player can dig/collect/push element" }, { + ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_INDESTRUCTIBLE, GADGET_ID_NONE, &custom_element_properties[EP_INDESTRUCTIBLE], @@ -3454,6 +3893,7 @@ static struct // ---------- element settings: configure 2 (custom elements) --------------- { + ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_CAN_MOVE, GADGET_ID_NONE, &custom_element_properties[EP_CAN_MOVE], @@ -3461,6 +3901,7 @@ static struct NULL, "element can move with some pattern" }, { + ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_CAN_FALL, GADGET_ID_NONE, &custom_element_properties[EP_CAN_FALL], @@ -3468,6 +3909,7 @@ static struct "can fall", "element can fall down" }, { + ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH, -1, ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_CAN_SMASH, GADGET_ID_CUSTOM_CAN_FALL, &custom_element_properties[EP_CAN_SMASH], @@ -3475,6 +3917,7 @@ static struct NULL, "element can smash other elements" }, { + ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE, &custom_element_properties[EP_SLIPPERY], @@ -3482,6 +3925,7 @@ static struct NULL, "other elements can fall down from it" }, { + ED_CHECKBUTTON_ID_CUSTOM_DEADLY, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_DEADLY, GADGET_ID_NONE, &custom_element_properties[EP_DEADLY], @@ -3489,6 +3933,7 @@ static struct NULL, "element can kill the player" }, { + ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_CAN_EXPLODE, GADGET_ID_NONE, &custom_element_properties[EP_CAN_EXPLODE], @@ -3496,6 +3941,7 @@ static struct NULL, "element can explode" }, { + ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE, &custom_element_properties[EP_EXPLODES_BY_FIRE], @@ -3503,6 +3949,7 @@ static struct "by fire", "element can explode by fire/explosion" }, { + ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH, -1, ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE, &custom_element_properties[EP_EXPLODES_SMASHED], @@ -3510,6 +3957,7 @@ static struct "smashed", "element can explode when smashed" }, { + ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT, -1, ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH, &custom_element_properties[EP_EXPLODES_IMPACT], @@ -3520,6 +3968,7 @@ static struct // ---------- element settings: advanced (custom elements) ------------------ { + ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_CAN_CHANGE, GADGET_ID_NONE, &custom_element_change.can_change, @@ -3527,6 +3976,7 @@ static struct "element changes to:", "change element on specified condition" }, { + ED_CHECKBUTTON_ID_CHANGE_DELAY, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_CHANGE_DELAY, GADGET_ID_NONE, &custom_element_change_events[CE_DELAY], @@ -3534,6 +3984,7 @@ static struct NULL, "element changes after delay" }, { + ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_CHANGE_BY_DIRECT_ACT, GADGET_ID_NONE, &custom_element_change_events[CE_BY_DIRECT_ACTION], @@ -3541,6 +3992,7 @@ static struct NULL, "element changes by direct action" }, { + ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5), GADGET_ID_CHANGE_BY_OTHER_ACT, GADGET_ID_NONE, &custom_element_change_events[CE_BY_OTHER_ACTION], @@ -3548,6 +4000,7 @@ static struct NULL, "element changes by other element" }, { + ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CHANGE_USE_EXPLOSION, GADGET_ID_NONE, &custom_element_change.explode, @@ -3555,6 +4008,7 @@ static struct "explode instead of change", "element explodes instead of change" }, { + ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT, ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CHANGE_USE_CONTENT, GADGET_ID_NONE, &custom_element_change.use_target_content, @@ -3562,6 +4016,7 @@ static struct "use extended change target:", "element changes to more elements" }, { + ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE, &custom_element_change.only_if_complete, @@ -3569,6 +4024,7 @@ static struct "replace all or nothing", "only replace when all can be changed" }, { + ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM, ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE, &custom_element_change.use_random_replace, @@ -3576,6 +4032,7 @@ static struct NULL, "use percentage for random replace" }, { + ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13), GADGET_ID_CHANGE_HAS_ACTION, GADGET_ID_NONE, &custom_element_change.has_action, @@ -3586,6 +4043,7 @@ static struct static struct { + int gadget_type_id; int x, y; int xoffset, yoffset; int gadget_id; @@ -3598,6 +4056,7 @@ static struct // ---------- level playfield content --------------------------------------- { + ED_DRAWING_ID_DRAWING_LEVEL, 0, 0, 0, 0, GADGET_ID_DRAWING_LEVEL, GADGET_ID_NONE, @@ -3609,6 +4068,7 @@ static struct // ---------- yam yam content ----------------------------------------------- { + ED_DRAWING_ID_YAMYAM_CONTENT_0, ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS, ED_AREA_YAMYAM_CONTENT_XOFF(0), ED_AREA_YAMYAM_CONTENT_YOFF(0), GADGET_ID_YAMYAM_CONTENT_0, GADGET_ID_NONE, @@ -3616,6 +4076,7 @@ static struct NULL, NULL, NULL, "1", NULL }, { + ED_DRAWING_ID_YAMYAM_CONTENT_1, ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS, ED_AREA_YAMYAM_CONTENT_XOFF(1), ED_AREA_YAMYAM_CONTENT_YOFF(1), GADGET_ID_YAMYAM_CONTENT_1, GADGET_ID_NONE, @@ -3623,6 +4084,7 @@ static struct NULL, NULL, NULL, "2", NULL }, { + ED_DRAWING_ID_YAMYAM_CONTENT_2, ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS, ED_AREA_YAMYAM_CONTENT_XOFF(2), ED_AREA_YAMYAM_CONTENT_YOFF(2), GADGET_ID_YAMYAM_CONTENT_2, GADGET_ID_NONE, @@ -3630,6 +4092,7 @@ static struct NULL, NULL, NULL, "3", NULL }, { + ED_DRAWING_ID_YAMYAM_CONTENT_3, ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS, ED_AREA_YAMYAM_CONTENT_XOFF(3), ED_AREA_YAMYAM_CONTENT_YOFF(3), GADGET_ID_YAMYAM_CONTENT_3, GADGET_ID_NONE, @@ -3637,6 +4100,7 @@ static struct NULL, NULL, NULL, "4", NULL }, { + ED_DRAWING_ID_YAMYAM_CONTENT_4, ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS, ED_AREA_YAMYAM_CONTENT_XOFF(4), ED_AREA_YAMYAM_CONTENT_YOFF(4), GADGET_ID_YAMYAM_CONTENT_4, GADGET_ID_NONE, @@ -3644,6 +4108,7 @@ static struct NULL, NULL, NULL, "5", NULL }, { + ED_DRAWING_ID_YAMYAM_CONTENT_5, ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS, ED_AREA_YAMYAM_CONTENT_XOFF(5), ED_AREA_YAMYAM_CONTENT_YOFF(5), GADGET_ID_YAMYAM_CONTENT_5, GADGET_ID_NONE, @@ -3651,6 +4116,7 @@ static struct NULL, NULL, NULL, "6", NULL }, { + ED_DRAWING_ID_YAMYAM_CONTENT_6, ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS, ED_AREA_YAMYAM_CONTENT_XOFF(6), ED_AREA_YAMYAM_CONTENT_YOFF(6), GADGET_ID_YAMYAM_CONTENT_6, GADGET_ID_NONE, @@ -3658,6 +4124,7 @@ static struct NULL, NULL, NULL, "7", NULL }, { + ED_DRAWING_ID_YAMYAM_CONTENT_7, ED_AREA_YAMYAM_CONTENT_XPOS, ED_AREA_YAMYAM_CONTENT_YPOS, ED_AREA_YAMYAM_CONTENT_XOFF(7), ED_AREA_YAMYAM_CONTENT_YOFF(7), GADGET_ID_YAMYAM_CONTENT_7, GADGET_ID_NONE, @@ -3668,6 +4135,7 @@ static struct // ---------- magic ball content -------------------------------------------- { + ED_DRAWING_ID_MAGIC_BALL_CONTENT_0, ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS, ED_AREA_MAGIC_BALL_CONTENT_XOFF(0), ED_AREA_MAGIC_BALL_CONTENT_YOFF(0), GADGET_ID_MAGIC_BALL_CONTENT_0, GADGET_ID_NONE, @@ -3675,6 +4143,7 @@ static struct NULL, NULL, NULL, "1", NULL }, { + ED_DRAWING_ID_MAGIC_BALL_CONTENT_1, ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS, ED_AREA_MAGIC_BALL_CONTENT_XOFF(1), ED_AREA_MAGIC_BALL_CONTENT_YOFF(1), GADGET_ID_MAGIC_BALL_CONTENT_1, GADGET_ID_NONE, @@ -3682,6 +4151,7 @@ static struct NULL, NULL, NULL, "2", NULL }, { + ED_DRAWING_ID_MAGIC_BALL_CONTENT_2, ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS, ED_AREA_MAGIC_BALL_CONTENT_XOFF(2), ED_AREA_MAGIC_BALL_CONTENT_YOFF(2), GADGET_ID_MAGIC_BALL_CONTENT_2, GADGET_ID_NONE, @@ -3689,6 +4159,7 @@ static struct NULL, NULL, NULL, "3", NULL }, { + ED_DRAWING_ID_MAGIC_BALL_CONTENT_3, ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS, ED_AREA_MAGIC_BALL_CONTENT_XOFF(3), ED_AREA_MAGIC_BALL_CONTENT_YOFF(3), GADGET_ID_MAGIC_BALL_CONTENT_3, GADGET_ID_NONE, @@ -3696,6 +4167,7 @@ static struct NULL, NULL, NULL, "4", NULL }, { + ED_DRAWING_ID_MAGIC_BALL_CONTENT_4, ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS, ED_AREA_MAGIC_BALL_CONTENT_XOFF(4), ED_AREA_MAGIC_BALL_CONTENT_YOFF(4), GADGET_ID_MAGIC_BALL_CONTENT_4, GADGET_ID_NONE, @@ -3703,6 +4175,7 @@ static struct NULL, NULL, NULL, "5", NULL }, { + ED_DRAWING_ID_MAGIC_BALL_CONTENT_5, ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS, ED_AREA_MAGIC_BALL_CONTENT_XOFF(5), ED_AREA_MAGIC_BALL_CONTENT_YOFF(5), GADGET_ID_MAGIC_BALL_CONTENT_5, GADGET_ID_NONE, @@ -3710,6 +4183,7 @@ static struct NULL, NULL, NULL, "6", NULL }, { + ED_DRAWING_ID_MAGIC_BALL_CONTENT_6, ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS, ED_AREA_MAGIC_BALL_CONTENT_XOFF(6), ED_AREA_MAGIC_BALL_CONTENT_YOFF(6), GADGET_ID_MAGIC_BALL_CONTENT_6, GADGET_ID_NONE, @@ -3717,6 +4191,7 @@ static struct NULL, NULL, NULL, "7", NULL }, { + ED_DRAWING_ID_MAGIC_BALL_CONTENT_7, ED_AREA_MAGIC_BALL_CONTENT_XPOS, ED_AREA_MAGIC_BALL_CONTENT_YPOS, ED_AREA_MAGIC_BALL_CONTENT_XOFF(7), ED_AREA_MAGIC_BALL_CONTENT_YOFF(7), GADGET_ID_MAGIC_BALL_CONTENT_7, GADGET_ID_NONE, @@ -3727,6 +4202,7 @@ static struct // ---------- android content ----------------------------------------------- { + ED_DRAWING_ID_ANDROID_CONTENT, ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(6), ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_ANDROID_CONTENT, GADGET_ID_NONE, @@ -3737,6 +4213,7 @@ static struct // ---------- amoeba content ------------------------------------------------ { + ED_DRAWING_ID_AMOEBA_CONTENT, ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(3), ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_AMOEBA_CONTENT, GADGET_ID_NONE, @@ -3744,9 +4221,64 @@ 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 ------------------------------------------- { + ED_DRAWING_ID_START_ELEMENT, -1, ED_AREA_1X1_SETTINGS_YPOS(10), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_START_ELEMENT, GADGET_ID_USE_START_ELEMENT, @@ -3757,6 +4289,7 @@ static struct // ---------- player artwork element ---------------------------------------- { + ED_DRAWING_ID_ARTWORK_ELEMENT, -1, ED_AREA_1X1_SETTINGS_YPOS(11), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_ARTWORK_ELEMENT, GADGET_ID_USE_ARTWORK_ELEMENT, @@ -3767,6 +4300,7 @@ static struct // ---------- player explosion element -------------------------------------- { + ED_DRAWING_ID_EXPLOSION_ELEMENT, -1, ED_AREA_1X1_SETTINGS_YPOS(12), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_EXPLOSION_ELEMENT, GADGET_ID_USE_EXPLOSION_ELEMENT, @@ -3777,6 +4311,7 @@ static struct // ---------- player initial inventory -------------------------------------- { + ED_DRAWING_ID_INVENTORY_CONTENT, -1, ED_AREA_1X1_SETTINGS_YPOS(1), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_INVENTORY_CONTENT, GADGET_ID_USE_INITIAL_INVENTORY, @@ -3787,6 +4322,7 @@ static struct // ---------- gray ball content ----------------------------------------- { + ED_DRAWING_ID_MM_BALL_CONTENT, ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(2), ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_MM_BALL_CONTENT, GADGET_ID_NONE, @@ -3799,6 +4335,7 @@ static struct // ---------- custom graphic ------------------------------------------------ { + ED_DRAWING_ID_CUSTOM_GRAPHIC, -1, ED_AREA_1X1_SETTINGS_YPOS(1), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_CUSTOM_GRAPHIC, GADGET_ID_CUSTOM_USE_GRAPHIC, @@ -3811,6 +4348,7 @@ static struct // ---------- custom content (when exploding) ------------------------------- { + ED_DRAWING_ID_CUSTOM_CONTENT, -1, ED_AREA_3X3_SETTINGS_YPOS(11), 0, ED_AREA_3X3_SETTINGS_YOFF, GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, // align three rows @@ -3821,6 +4359,7 @@ static struct // ---------- custom enter and leave element (when moving) ------------------ { + ED_DRAWING_ID_CUSTOM_MOVE_ENTER, ED_AREA_1X1_SETTINGS_XPOS(1), ED_AREA_1X1_SETTINGS_YPOS(3), ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_CUSTOM_MOVE_ENTER, GADGET_ID_NONE, @@ -3828,6 +4367,7 @@ static struct "can dig:", " ", NULL, NULL, "element that can be digged/collected" }, { + ED_DRAWING_ID_CUSTOM_MOVE_LEAVE, -1, ED_AREA_1X1_SETTINGS_YPOS(3), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, @@ -3840,6 +4380,7 @@ static struct // ---------- custom change target ------------------------------------------ { + ED_DRAWING_ID_CUSTOM_CHANGE_TARGET, -1, ED_AREA_1X1_SETTINGS_YPOS(1), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_CUSTOM_CHANGE_TARGET, GADGET_ID_CUSTOM_CAN_CHANGE, @@ -3850,6 +4391,7 @@ static struct // ---------- custom change content (extended change target) ---------------- { + ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT, -1, ED_AREA_3X3_SETTINGS_YPOS(9), 0, ED_AREA_3X3_SETTINGS_YOFF, GADGET_ID_CUSTOM_CHANGE_CONTENT, GADGET_ID_NONE, // align three rows @@ -3860,6 +4402,7 @@ static struct // ---------- custom change trigger (element causing change) ---------------- { + ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER, -1, ED_AREA_1X1_SETTINGS_YPOS(5), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION, @@ -3870,6 +4413,7 @@ static struct // ---------- custom change action (element used for action) ---------------- { + ED_DRAWING_ID_CUSTOM_CHANGE_ACTION, -1, ED_AREA_1X1_SETTINGS_YPOS(13), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_CUSTOM_CHANGE_ACTION, GADGET_ID_ACTION_ARG, @@ -3880,6 +4424,7 @@ static struct // ---------- group element content ----------------------------------------- { + ED_DRAWING_ID_GROUP_CONTENT, ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(2), ED_AREA_1X1_SETTINGS_XOFF, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_GROUP_CONTENT, GADGET_ID_NONE, @@ -3890,6 +4435,7 @@ static struct // ---------- random background (for random painting) ----------------------- { + ED_DRAWING_ID_RANDOM_BACKGROUND, -1, ED_AREA_1X1_LSETTINGS_YPOS(1), 0, ED_AREA_1X1_LSETTINGS_YOFF, GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED, @@ -4067,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, @@ -4083,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, @@ -4125,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, @@ -4145,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, @@ -5860,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) @@ -6072,6 +6593,7 @@ static void ReinitializeElementList_EnableSections(void) } else if (level.game_engine_type == GAME_ENGINE_TYPE_BD) { + setup_editor_el_players = FALSE; setup_editor_el_boulderdash = FALSE; setup_editor_el_emerald_mine = FALSE; setup_editor_el_emerald_mine_club = FALSE; @@ -6547,6 +7069,7 @@ static void CreateControlButtons(void) // create toolbox buttons for (i = 0; i < ED_NUM_CTRL_BUTTONS; i++) { + int type_id = controlbutton_info[i].gadget_id; // same as gadget ID here int id = controlbutton_info[i].gadget_id; int type = controlbutton_info[i].gadget_type; int graphic = controlbutton_info[i].graphic; @@ -6570,6 +7093,9 @@ static void CreateControlButtons(void) int radio_button_nr = RADIO_NR_NONE; boolean checked = FALSE; + if (type_id != i) + Fail("'controlbutton_info' structure corrupted at index %d -- please fix", i); + if (type == GD_TYPE_RADIO_BUTTON) { event_mask = GD_EVENT_PRESSED; @@ -6630,7 +7156,7 @@ static void CreateControlButtons(void) } gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, controlbutton_info[i].infotext, GDI_X, x, @@ -6679,6 +7205,7 @@ static void CreateControlButtons(void) for (i = 0; i < ED_NUM_SCROLLBUTTONS; i++) { int id = scrollbutton_info[i].gadget_id; + int type_id = scrollbutton_info[i].gadget_type_id; int graphic = scrollbutton_info[i].graphic; struct GraphicInfo *gd = &graphic_info[graphic]; Bitmap *gd_bitmap = gd->bitmap; @@ -6692,6 +7219,9 @@ static void CreateControlButtons(void) int y = scrollbutton_pos[i].y; unsigned int event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED; + if (type_id != i) + Fail("'scrollbutton_info' structure corrupted at index %d -- please fix", i); + if (id == GADGET_ID_SCROLL_LIST_UP || id == GADGET_ID_SCROLL_LIST_DOWN) { @@ -6705,7 +7235,7 @@ static void CreateControlButtons(void) } gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, scrollbutton_info[i].infotext, GDI_X, x, @@ -6730,6 +7260,7 @@ static void CreateControlButtons(void) // create buttons for element list for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++) { + int type_id = i; int id = GADGET_ID_ELEMENTLIST_FIRST + i; int graphic = IMG_EDITOR_PALETTE_BUTTON; struct GraphicInfo *gd = &graphic_info[graphic]; @@ -6754,7 +7285,7 @@ static void CreateControlButtons(void) deco_ypos = (gd->height - tile_size) / 2; gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, getElementInfoText(element), GDI_X, x, @@ -6788,9 +7319,13 @@ static void CreateCounterButtons(void) for (i = 0; i < ED_NUM_COUNTERBUTTONS; i++) { - int j; + int type_id = counterbutton_info[i].gadget_type_id; int x = SX + ED_SETTINGS_X(counterbutton_info[i].x); // down count button int y = SY + ED_SETTINGS_Y(counterbutton_info[i].y); + int j; + + if (type_id != i) + Fail("'counterbutton_info' structure corrupted at index %d -- please fix", i); // determine horizontal position to the right of specified gadget if (counterbutton_info[i].gadget_id_align != GADGET_ID_NONE) @@ -6850,7 +7385,7 @@ static void CreateCounterButtons(void) (j == 0 ? "decrease" : "increase")); gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, infotext, GDI_X, x, @@ -6907,7 +7442,7 @@ static void CreateCounterButtons(void) gd_y2 = gd->src_y + gd->active_yoffset; gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, "enter counter value", GDI_X, x, @@ -6953,6 +7488,7 @@ static void CreateDrawingAreas(void) { struct GadgetInfo *gi; int id = drawingarea_info[i].gadget_id; + int type_id = drawingarea_info[i].gadget_type_id; int x = SX + ED_AREA_SETTINGS_X(drawingarea_info[i]); int y = SY + ED_AREA_SETTINGS_Y(drawingarea_info[i]); int area_xsize = drawingarea_info[i].area_xsize; @@ -6963,6 +7499,9 @@ static void CreateDrawingAreas(void) GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS | GD_EVENT_PIXEL_PRECISE; + if (type_id != i) + Fail("'drawingarea_info' structure corrupted at index %d -- please fix", i); + // determine horizontal position to the right of specified gadget if (drawingarea_info[i].gadget_id_align != GADGET_ID_NONE) x = (right_gadget_border[drawingarea_info[i].gadget_id_align] + @@ -6973,7 +7512,7 @@ static void CreateDrawingAreas(void) x += getTextWidthForDrawingArea(drawingarea_info[i].text_left); gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_X, x, GDI_Y, y, GDI_TYPE, GD_TYPE_DRAWING_AREA, @@ -7009,8 +7548,12 @@ static void CreateTextInputGadgets(void) unsigned int event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING; char infotext[MAX_OUTPUT_LINESIZE + 1]; int id = textinput_info[i].gadget_id; + int type_id = textinput_info[i].gadget_type_id; int x, y; + if (type_id != i) + Fail("'textinput_info' structure corrupted at index %d -- please fix", i); + if (i == ED_TEXTINPUT_ID_ELEMENT_NAME) { int element_border = graphic_info[IMG_EDITOR_ELEMENT_BORDER].border_size; @@ -7037,7 +7580,7 @@ static void CreateTextInputGadgets(void) infotext[max_infotext_len] = '\0'; gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_INFO_TEXT, infotext, GDI_X, SX + x, GDI_Y, SY + y, @@ -7078,14 +7621,18 @@ static void CreateTextAreaGadgets(void) unsigned int event_mask = GD_EVENT_TEXT_LEAVING; char infotext[MAX_OUTPUT_LINESIZE + 1]; int id = textarea_info[i].gadget_id; + int type_id = textarea_info[i].gadget_type_id; int area_xsize = textarea_info[i].xsize; int area_ysize = textarea_info[i].ysize; + if (type_id != i) + Fail("'textarea_info' structure corrupted at index %d -- please fix", i); + sprintf(infotext, "Enter %s", textarea_info[i].infotext); infotext[max_infotext_len] = '\0'; gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_INFO_TEXT, infotext, GDI_X, SX + ED_SETTINGS_X(textarea_info[i].x), GDI_Y, SY + ED_SETTINGS_Y(textarea_info[i].y), @@ -7126,11 +7673,15 @@ static void CreateSelectboxGadgets(void) struct GadgetInfo *gi; char infotext[MAX_OUTPUT_LINESIZE + 1]; int id = selectbox_info[i].gadget_id; + int type_id = selectbox_info[i].gadget_type_id; int x = SX + ED_SETTINGS_X(selectbox_info[i].x); int y = SY + ED_SETTINGS_Y(selectbox_info[i].y); unsigned int event_mask = GD_EVENT_RELEASED | GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING; + if (type_id != i) + Fail("'selectbox_info' structure corrupted at index %d -- please fix", i); + if (selectbox_info[i].size == -1) // dynamically determine size { // (we cannot use -1 for uninitialized values if we directly compare @@ -7158,7 +7709,7 @@ static void CreateSelectboxGadgets(void) infotext[max_infotext_len] = '\0'; gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_INFO_TEXT, infotext, GDI_X, x, GDI_Y, y, @@ -7196,8 +7747,9 @@ static void CreateTextbuttonGadgets(void) for (i = 0; i < ED_NUM_TEXTBUTTONS; i++) { int id = textbutton_info[i].gadget_id; + int type_id = textbutton_info[i].gadget_type_id; int is_tab_button = - ((id >= GADGET_ID_LEVELCONFIG_LEVEL && id <= GADGET_ID_LEVELCONFIG_EDITOR) || + ((id >= GADGET_ID_LEVELCONFIG_LEVEL && id <= GADGET_ID_LEVELCONFIG_ENGINE) || (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE)); int graphic = (is_tab_button ? IMG_EDITOR_TABBUTTON : IMG_EDITOR_TEXTBUTTON); @@ -7218,6 +7770,9 @@ static void CreateTextbuttonGadgets(void) int x = SX + ED_SETTINGS_X(textbutton_info[i].x); int y = SY + ED_SETTINGS_Y(textbutton_info[i].y); + if (type_id != i) + Fail("'textbutton_info' structure corrupted at index %d -- please fix", i); + if (textbutton_info[i].size == -1) // dynamically determine size textbutton_info[i].size = strlen(textbutton_info[i].text); @@ -7240,7 +7795,7 @@ static void CreateTextbuttonGadgets(void) x += getTextWidthForGadget(textbutton_info[i].text_left); gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, infotext, GDI_X, x, @@ -7279,6 +7834,7 @@ static void CreateGraphicbuttonGadgets(void) for (i = 0; i < ED_NUM_GRAPHICBUTTONS; i++) { int id = graphicbutton_info[i].gadget_id; + int type_id = graphicbutton_info[i].gadget_type_id; int x = SX + ED_SETTINGS_X(graphicbutton_info[i].x); int y = SY + ED_SETTINGS_Y(graphicbutton_info[i].y); int graphic = graphicbutton_info[i].graphic; @@ -7289,6 +7845,9 @@ static void CreateGraphicbuttonGadgets(void) int gd_y2 = gd->src_y + gd->pressed_yoffset; unsigned int event_mask = GD_EVENT_RELEASED; + if (type_id != i) + Fail("'graphicbutton_info' structure corrupted at index %d -- please fix", i); + // determine horizontal position to the right of specified gadget if (graphicbutton_info[i].gadget_id_align != GADGET_ID_NONE) x = (right_gadget_border[graphicbutton_info[i].gadget_id_align] + @@ -7299,7 +7858,7 @@ static void CreateGraphicbuttonGadgets(void) x += getTextWidthForGadget(graphicbutton_info[i].text_left); gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, graphicbutton_info[i].infotext, GDI_X, x, @@ -7371,6 +7930,7 @@ static void CreateScrollbarGadgets(void) for (i = 0; i < ED_NUM_SCROLLBARS; i++) { int id = scrollbar_info[i].gadget_id; + int type_id = scrollbar_info[i].gadget_type_id; int graphic = scrollbar_info[i].graphic; struct GraphicInfo *gd = &graphic_info[graphic]; int gd_x1 = gd->src_x; @@ -7381,6 +7941,9 @@ static void CreateScrollbarGadgets(void) int items_max, items_visible, item_position; unsigned int event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS; + if (type_id != i) + Fail("'scrollbar_info' structure corrupted at index %d -- please fix", i); + if (i == ED_SCROLLBAR_ID_LIST_VERTICAL) { items_max = num_editor_elements / ED_ELEMENTLIST_BUTTONS_HORIZ; @@ -7404,7 +7967,7 @@ static void CreateScrollbarGadgets(void) } gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, scrollbar_info[i].infotext, GDI_X, scrollbar_pos[i].x, @@ -7443,6 +8006,7 @@ static void CreateCheckbuttonGadgets(void) for (i = 0; i < ED_NUM_CHECKBUTTONS; i++) { int id = checkbutton_info[i].gadget_id; + int type_id = checkbutton_info[i].gadget_type_id; int graphic = (id == GADGET_ID_STICK_ELEMENT ? IMG_EDITOR_STICKYBUTTON : IMG_EDITOR_CHECKBOX); struct GraphicInfo *gd = &graphic_info[graphic]; @@ -7458,6 +8022,9 @@ static void CreateCheckbuttonGadgets(void) int y = SY + ED_SETTINGS_Y(checkbutton_info[i].y); unsigned int event_mask = GD_EVENT_PRESSED; + if (type_id != i) + Fail("'checkbutton_info' structure corrupted at index %d -- please fix", i); + // determine horizontal position to the right of specified gadget if (checkbutton_info[i].gadget_id_align != GADGET_ID_NONE) x = (right_gadget_border[checkbutton_info[i].gadget_id_align] + @@ -7468,7 +8035,7 @@ static void CreateCheckbuttonGadgets(void) x += getTextWidthForGadget(checkbutton_info[i].text_left); gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, checkbutton_info[i].infotext, GDI_X, x, @@ -7513,10 +8080,14 @@ static void CreateRadiobuttonGadgets(void) for (i = 0; i < ED_NUM_RADIOBUTTONS; i++) { int id = radiobutton_info[i].gadget_id; + int type_id = radiobutton_info[i].gadget_type_id; int x = SX + ED_SETTINGS_X(radiobutton_info[i].x); int y = SY + ED_SETTINGS_Y(radiobutton_info[i].y); unsigned int event_mask = GD_EVENT_PRESSED; + if (type_id != i) + Fail("'radiobutton_info' structure corrupted at index %d -- please fix", i); + int checked = (*radiobutton_info[i].value == radiobutton_info[i].checked_value); @@ -7530,7 +8101,7 @@ static void CreateRadiobuttonGadgets(void) x += getTextWidthForGadget(radiobutton_info[i].text_left); gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_CUSTOM_TYPE_ID, i, + GDI_CUSTOM_TYPE_ID, type_id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, radiobutton_info[i].infotext, GDI_X, x, @@ -7653,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 @@ -7721,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; @@ -7946,7 +8513,7 @@ static void MapMainDrawingArea(void) no_vertical_scrollbar = (lev_fieldy <= ed_fieldy); } - for (i=ED_SCROLLBUTTON_ID_AREA_FIRST; i <= ED_SCROLLBUTTON_ID_AREA_LAST; i++) + for (i = ED_SCROLLBUTTON_ID_AREA_FIRST; i <= ED_SCROLLBUTTON_ID_AREA_LAST; i++) { if (((i == ED_SCROLLBUTTON_ID_AREA_LEFT || i == ED_SCROLLBUTTON_ID_AREA_RIGHT) && @@ -9494,10 +10061,14 @@ static void DrawLevelConfigTabulatorGadgets(void) { struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELCONFIG_LEVEL]; Pixel tab_color = getTabulatorBarColor(); - int id_first = ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST; - int id_last = ED_TAB_BUTTON_ID_LEVELCONFIG_LAST; + int id_first = ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL; + int id_last = ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR; int i; + // draw additional "engine" tabulator when using native BD engine + if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + id_last = ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE; + for (i = id_first; i <= id_last; i++) { int gadget_id = textbutton_info[i].gadget_id; @@ -9680,11 +10251,11 @@ static void DrawLevelConfigEditor(void) MapCounterButtons(i); // draw checkbutton gadgets - for (i=ED_CHECKBUTTON_ID_EDITOR_FIRST; i<= ED_CHECKBUTTON_ID_EDITOR_LAST; i++) + for (i = ED_CHECKBUTTON_ID_EDITOR_FIRST; i <= ED_CHECKBUTTON_ID_EDITOR_LAST; i++) MapCheckbuttonGadget(i); // draw radiobutton gadgets - for (i=ED_RADIOBUTTON_ID_EDITOR_FIRST; i<= ED_RADIOBUTTON_ID_EDITOR_LAST; i++) + for (i = ED_RADIOBUTTON_ID_EDITOR_FIRST; i <= ED_RADIOBUTTON_ID_EDITOR_LAST; i++) MapRadiobuttonGadget(i); // draw drawing area @@ -9694,6 +10265,31 @@ static void DrawLevelConfigEditor(void) MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2); } +static void DrawLevelConfigEngine(void) +{ + int i; + + // 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++) + MapCheckbuttonGadget(i); + + // draw selectbox gadgets + for (i = ED_SELECTBOX_ID_ENGINE_FIRST; i <= ED_SELECTBOX_ID_ENGINE_LAST; i++) + MapSelectboxGadget(i); +} + static void DrawLevelConfigWindow(void) { char *text = "Global Settings"; @@ -9721,6 +10317,8 @@ static void DrawLevelConfigWindow(void) DrawLevelConfigLevelSet(); else if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_EDITOR) DrawLevelConfigEditor(); + else if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_ENGINE) + DrawLevelConfigEngine(); } static void DrawCustomContentArea(void) @@ -10166,10 +10764,15 @@ static void DrawPropertiesInfo(void) } #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" @@ -10192,130 +10795,145 @@ static struct char *text; } elements_with_counter[] = { - { EL_EMERALD, &level.score[SC_EMERALD], TEXT_COLLECTING }, - { EL_BD_DIAMOND, &level.score[SC_EMERALD], TEXT_COLLECTING }, - { 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 }, + { EL_BD_AMOEBA, &level.bd_amoeba_fast_growth_rate, TEXT_AMOEBA_FAST_RATE }, + { 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_BD_AMOEBA_2, &level.bd_amoeba_2_fast_growth_rate, TEXT_AMOEBA_FAST_RATE }, + { 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 } }; static boolean checkPropertiesConfig(int element) { int i; + // special case: empty space customization only available in R'n'D game engine + 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) || @@ -10326,18 +10944,24 @@ static boolean checkPropertiesConfig(int element) IS_MM_MCDUFFIN(element) || IS_DF_LASER(element) || IS_PLAYER_ELEMENT(element) || + IS_BD_PLAYER_ELEMENT(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_SOKOBAN_OBJECT || - element == EL_SOKOBAN_FIELD_EMPTY || - element == EL_SOKOBAN_FIELD_FULL) + 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; } @@ -10423,6 +11047,24 @@ static void DrawPropertiesConfig(void) { if (elements_with_counter[i].element == properties_element) { + // 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: 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 = @@ -10434,6 +11076,12 @@ static void DrawPropertiesConfig(void) (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; @@ -10443,6 +11091,12 @@ static void DrawPropertiesConfig(void) counterbutton_info[counter_id].min_value = 0; // min neighbours counterbutton_info[counter_id].max_value = 8; // max neighbours } + else if (strEqual(elements_with_counter[i].text, TEXT_AMOEBA_SLOW_RATE) || + strEqual(elements_with_counter[i].text, TEXT_AMOEBA_FAST_RATE)) + { + counterbutton_info[counter_id].min_value = 0; // min percent + counterbutton_info[counter_id].max_value = 100; // max percent + } else { // !!! CHANGE THIS FOR CERTAIN ELEMENTS !!! @@ -10463,7 +11117,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 || @@ -10564,7 +11237,56 @@ static void DrawPropertiesConfig(void) } } - if (IS_GEM(properties_element)) + 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); + + // 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) + { + 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); + + 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) @@ -10601,7 +11323,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); @@ -14181,10 +14903,18 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) } else if (type_id == ED_SELECTBOX_ID_GAME_ENGINE_TYPE) { - // update element selection list + // show or hide "engine" tabulator depending on game engine type + DrawLevelConfigWindow(); + + // update element selection list depending on game engine type ReinitializeElementList(); ModifyEditorElementList(); } + else if (type_id == ED_SELECTBOX_ID_BD_SCHEDULING_TYPE) + { + // update BD cycle delay counter gadgets depending on BD scheduling type + DrawLevelConfigWindow(); + } // do not mark level as modified for certain non-level-changing gadgets if (type_id == ED_SELECTBOX_ID_LEVELSET_SAVE_MODE ||