X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=1cdf04d22af28da74faf22a3c72eb023091bdcbc;hb=89c6f370f355a7822c99faa5ae078b580904d7a9;hp=0c3ec36fd5b9ab1f5da750337eb8a39c9536a7fd;hpb=50b245176334bdd433e19e589b97557962f91f75;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 0c3ec36f..1cdf04d2 100644 --- a/src/editor.c +++ b/src/editor.c @@ -606,6 +606,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 +649,8 @@ enum GADGET_ID_RANDOM_PERCENTAGE, GADGET_ID_RANDOM_QUANTITY, GADGET_ID_RANDOM_RESTRICTED, + GADGET_ID_BD_INTERMISSION, + GADGET_ID_BD_PAL_TIMING, GADGET_ID_STICK_ELEMENT, GADGET_ID_EM_SLIPPERY_GEMS, GADGET_ID_EM_EXPLODES_BY_FIRE, @@ -917,6 +920,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, @@ -932,7 +936,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 @@ -964,6 +968,8 @@ 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_STICK_ELEMENT, ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS, ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE, @@ -1044,6 +1050,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_PAL_TIMING + #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 @@ -1136,6 +1145,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 @@ -2918,6 +2928,13 @@ static struct 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) --------------------------------------- @@ -3231,6 +3248,22 @@ static struct 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(1), + GADGET_ID_BD_PAL_TIMING, GADGET_ID_NONE, + &level.bd_pal_timing, + NULL, NULL, + "PAL timing", "use slower timer (like PAL C64)" + }, // ---------- element settings: configure (various elements) ---------------- @@ -7460,7 +7493,7 @@ static void CreateTextbuttonGadgets(void) 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); @@ -8228,7 +8261,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) && @@ -9776,10 +9809,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; @@ -9962,11 +9999,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 @@ -9976,6 +10013,15 @@ static void DrawLevelConfigEditor(void) MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2); } +static void DrawLevelConfigEngine(void) +{ + int i; + + // draw checkbutton gadgets + for (i = ED_CHECKBUTTON_ID_ENGINE_FIRST; i <= ED_CHECKBUTTON_ID_ENGINE_LAST; i++) + MapCheckbuttonGadget(i); +} + static void DrawLevelConfigWindow(void) { char *text = "Global Settings"; @@ -10003,6 +10049,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) @@ -10448,6 +10496,7 @@ 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" @@ -10474,130 +10523,133 @@ 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_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; + if (IS_GEM(element) || IS_CUSTOM_ELEMENT(element) || IS_GROUP_ELEMENT(element) || @@ -10608,14 +10660,12 @@ 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_BD_PLAYER || - element == EL_SOKOBAN_OBJECT || - element == EL_SOKOBAN_FIELD_EMPTY || - element == EL_SOKOBAN_FIELD_FULL) + MAYBE_DONT_COLLIDE_WITH(element)) return TRUE; else for (i = 0; elements_with_counter[i].element != -1; i++) @@ -10847,11 +10897,17 @@ static void DrawPropertiesConfig(void) } } - if (properties_element == EL_BD_PLAYER) + if (IS_BD_PLAYER_ELEMENT(properties_element)) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS); - if (IS_GEM(properties_element)) + // 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) + { + checkbutton_info[ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS].y = + ED_ELEMENT_SETTINGS_XPOS(properties_element == EL_BD_DIAMOND ? 2 : 1); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS); + } if (properties_element == EL_EM_DYNAMITE) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE); @@ -14467,7 +14523,10 @@ 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(); }