X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=77cf39a00fdba9c92f5f0203782b86aaf47ba1ee;hb=0d7a16964bdac425962c0c0bcaa7488d9664c8d2;hp=9ae24facf6b7dbf064384449a81610cd96064d72;hpb=ac4c028b525860750de315d626730ac493f56944;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 9ae24fac..77cf39a0 100644 --- a/src/init.c +++ b/src/init.c @@ -260,21 +260,11 @@ static int getFontBitmapID(int font_nr) { int special = -1; - if (game_status == MAINMENU || game_status == TYPENAME) + if (game_status >= GAME_MODE_MAIN && game_status <= GAME_MODE_PSEUDO_PREVIEW) + special = game_status; + else if (game_status == GAME_MODE_PSEUDO_TYPENAME) special = GFX_SPECIAL_ARG_MAIN; - else if (game_status == CHOOSELEVEL) - special = GFX_SPECIAL_ARG_LEVELS; - else if (game_status == HALLOFFAME) - special = GFX_SPECIAL_ARG_SCORES; - else if (game_status == LEVELED) - special = GFX_SPECIAL_ARG_EDITOR; - else if (game_status == HELPSCREEN) - special = GFX_SPECIAL_ARG_INFO; - else if (game_status == SETUP) - special = GFX_SPECIAL_ARG_SETUP; - else if (game_status == PSEUDO_PREVIEW) - special = GFX_SPECIAL_ARG_PREVIEW; - else if (game_status == PLAYING || game_status == PSEUDO_DOOR) + else if (game_status == GAME_MODE_PLAYING) special = GFX_SPECIAL_ARG_DOOR; if (special != -1) @@ -438,6 +428,19 @@ void InitElementGraphicInfo() if (graphic_info[graphic].bitmap == NULL) continue; + if ((action > -1 || direction > -1) && el2img(element) != -1) + { + boolean base_redefined = getImageListEntry(el2img(element))->redefined; + boolean act_dir_redefined = getImageListEntry(graphic)->redefined; + + /* if the base graphic ("emerald", for example) has been redefined, + but not the action graphic ("emerald.falling", for example), do not + use an existing (in this case considered obsolete) action graphic + anymore, but use the automatically determined default graphic */ + if (base_redefined && !act_dir_redefined) + continue; + } + if (action < 0) action = ACTION_DEFAULT; @@ -465,6 +468,10 @@ void InitElementGraphicInfo() if (action < 0) action = ACTION_DEFAULT; + if (direction < 0) + for (dir=0; dir -1) element_info[element].direction_graphic[action][direction] = graphic; else @@ -491,9 +498,9 @@ void InitElementGraphicInfo() for (act=0; actredefined; boolean special_redefined = getImageListEntry(graphic)->redefined; + /* if the base graphic ("emerald", for example) has been redefined, + but not the special graphic ("emerald.EDITOR", for example), do not + use an existing (in this case considered obsolete) special graphic + anymore, but use the automatically created (down-scaled) graphic */ if (base_redefined && !special_redefined) continue; @@ -1078,206 +1089,113 @@ static void ReinitializeMusic() /* currently nothing to do */ } -void InitElementProperties() +void InitElementPropertiesStatic() { - int i, j; - - static int ep_amoebalive[] = + static int ep_diggable[] = { - EL_AMOEBA_WET, - EL_AMOEBA_DRY, - EL_AMOEBA_FULL, - EL_BD_AMOEBA, + EL_SAND, + EL_SP_BASE, + EL_SP_BUGGY_BASE, + EL_SP_BUGGY_BASE_ACTIVATING, + EL_TRAP, + EL_INVISIBLE_SAND, + EL_INVISIBLE_SAND_ACTIVE, + + /* !!! currently not diggable, but handled by 'ep_dont_run_into' !!! */ +#if 0 + EL_LANDMINE, + EL_TRAP_ACTIVE, + EL_SP_BUGGY_BASE_ACTIVE, +#endif -1 }; - static int ep_amoeboid[] = + static int ep_collectible[] = { - EL_AMOEBA_DEAD, - EL_AMOEBA_WET, - EL_AMOEBA_DRY, - EL_AMOEBA_FULL, - EL_BD_AMOEBA, + EL_BD_DIAMOND, + EL_EMERALD, + EL_DIAMOND, + EL_EMERALD_YELLOW, + EL_EMERALD_RED, + EL_EMERALD_PURPLE, + EL_KEY_1, + EL_KEY_2, + EL_KEY_3, + EL_KEY_4, + EL_EM_KEY_1, + EL_EM_KEY_2, + EL_EM_KEY_3, + EL_EM_KEY_4, + EL_DYNAMITE, + EL_DYNABOMB_INCREASE_NUMBER, + EL_DYNABOMB_INCREASE_SIZE, + EL_DYNABOMB_INCREASE_POWER, + EL_SP_INFOTRON, + EL_SP_DISK_RED, + EL_PEARL, + EL_CRYSTAL, + EL_KEY_WHITE, + EL_SHIELD_NORMAL, + EL_SHIELD_DEADLY, + EL_EXTRA_TIME, + EL_ENVELOPE, + EL_SPEED_PILL, -1 }; - static int ep_can_be_crumbled[] = + static int ep_dont_run_into[] = { - EL_SAND, - EL_LANDMINE, - EL_TRAP, + /* same elements as in 'ep_dont_touch' */ + EL_BUG, + EL_SPACESHIP, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, + + /* same elements as in 'ep_dont_collide_with' */ + EL_YAMYAM, + EL_DARK_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON, + + /* new elements */ + EL_AMOEBA_DROP, + EL_ACID, + + /* !!! maybe this should better be handled by 'ep_diggable' !!! */ +#if 1 + EL_SP_BUGGY_BASE_ACTIVE, EL_TRAP_ACTIVE, + EL_LANDMINE, +#endif -1 }; - static int ep_solid[] = + static int ep_dont_collide_with[] = { - EL_WALL, - EL_EXPANDABLE_WALL, - EL_EXPANDABLE_WALL_HORIZONTAL, - EL_EXPANDABLE_WALL_VERTICAL, - EL_EXPANDABLE_WALL_ANY, - EL_BD_WALL, - EL_WALL_CRUMBLED, - EL_EXIT_CLOSED, - EL_EXIT_OPENING, - EL_EXIT_OPEN, - EL_AMOEBA_DEAD, - EL_AMOEBA_WET, - EL_AMOEBA_DRY, - EL_AMOEBA_FULL, - EL_BD_AMOEBA, - EL_QUICKSAND_EMPTY, - EL_QUICKSAND_FULL, - EL_QUICKSAND_FILLING, - EL_QUICKSAND_EMPTYING, - EL_MAGIC_WALL, - EL_MAGIC_WALL_ACTIVE, - EL_MAGIC_WALL_EMPTYING, - EL_MAGIC_WALL_FILLING, - EL_MAGIC_WALL_FULL, - EL_MAGIC_WALL_DEAD, - EL_BD_MAGIC_WALL, - EL_BD_MAGIC_WALL_ACTIVE, - EL_BD_MAGIC_WALL_EMPTYING, - EL_BD_MAGIC_WALL_FULL, - EL_BD_MAGIC_WALL_FILLING, - EL_BD_MAGIC_WALL_DEAD, - EL_GAME_OF_LIFE, - EL_BIOMAZE, - EL_SP_CHIP_SINGLE, - EL_SP_CHIP_LEFT, - EL_SP_CHIP_RIGHT, - EL_SP_CHIP_TOP, - EL_SP_CHIP_BOTTOM, - EL_SP_TERMINAL, - EL_SP_TERMINAL_ACTIVE, - EL_SP_EXIT_CLOSED, - EL_SP_EXIT_OPEN, - EL_INVISIBLE_WALL, - EL_INVISIBLE_WALL_ACTIVE, - EL_SWITCHGATE_SWITCH_UP, - EL_SWITCHGATE_SWITCH_DOWN, - EL_TIMEGATE_SWITCH, - EL_TIMEGATE_SWITCH_ACTIVE, - EL_EMC_WALL_1, - EL_EMC_WALL_2, - EL_EMC_WALL_3, - EL_EMC_WALL_4, - EL_EMC_WALL_5, - EL_EMC_WALL_6, - EL_EMC_WALL_7, - EL_EMC_WALL_8, - EL_WALL_PEARL, - EL_WALL_CRYSTAL, + /* same elements as in 'ep_dont_touch' */ + EL_BUG, + EL_SPACESHIP, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, - /* the following elements are a direct copy of "indestructible" elements, - except "EL_ACID", which is "indestructible", but not "solid"! */ -#if 0 - EL_ACID, -#endif - EL_STEELWALL, - EL_ACID_POOL_TOPLEFT, - EL_ACID_POOL_TOPRIGHT, - EL_ACID_POOL_BOTTOMLEFT, - EL_ACID_POOL_BOTTOM, - EL_ACID_POOL_BOTTOMRIGHT, - EL_SP_HARDWARE_GRAY, - EL_SP_HARDWARE_GREEN, - EL_SP_HARDWARE_BLUE, - EL_SP_HARDWARE_RED, - EL_SP_HARDWARE_YELLOW, - EL_SP_HARDWARE_BASE_1, - EL_SP_HARDWARE_BASE_2, - EL_SP_HARDWARE_BASE_3, - EL_SP_HARDWARE_BASE_4, - EL_SP_HARDWARE_BASE_5, - EL_SP_HARDWARE_BASE_6, - EL_INVISIBLE_STEELWALL, - EL_INVISIBLE_STEELWALL_ACTIVE, - EL_CONVEYOR_BELT_1_SWITCH_LEFT, - EL_CONVEYOR_BELT_1_SWITCH_MIDDLE, - EL_CONVEYOR_BELT_1_SWITCH_RIGHT, - EL_CONVEYOR_BELT_2_SWITCH_LEFT, - EL_CONVEYOR_BELT_2_SWITCH_MIDDLE, - EL_CONVEYOR_BELT_2_SWITCH_RIGHT, - EL_CONVEYOR_BELT_3_SWITCH_LEFT, - EL_CONVEYOR_BELT_3_SWITCH_MIDDLE, - EL_CONVEYOR_BELT_3_SWITCH_RIGHT, - EL_CONVEYOR_BELT_4_SWITCH_LEFT, - EL_CONVEYOR_BELT_4_SWITCH_MIDDLE, - EL_CONVEYOR_BELT_4_SWITCH_RIGHT, - EL_LIGHT_SWITCH, - EL_LIGHT_SWITCH_ACTIVE, - EL_SIGN_EXCLAMATION, - EL_SIGN_RADIOACTIVITY, - EL_SIGN_STOP, - EL_SIGN_WHEELCHAIR, - EL_SIGN_PARKING, - EL_SIGN_ONEWAY, - EL_SIGN_HEART, - EL_SIGN_TRIANGLE, - EL_SIGN_ROUND, - EL_SIGN_EXIT, - EL_SIGN_YINYANG, - EL_SIGN_OTHER, - EL_STEELWALL_SLANTED, - EL_EMC_STEELWALL_1, - EL_EMC_STEELWALL_2, - EL_EMC_STEELWALL_3, - EL_EMC_STEELWALL_4, - EL_CRYSTAL, - EL_GATE_1_CLOSED, - EL_GATE_2_CLOSED, - EL_GATE_3_CLOSED, - EL_GATE_4_CLOSED, - EL_GATE_1_OPEN, - EL_GATE_2_OPEN, - EL_GATE_3_OPEN, - EL_GATE_4_OPEN, - EL_GATE_1_GRAY_CLOSED, - EL_GATE_2_GRAY_CLOSED, - EL_GATE_3_GRAY_CLOSED, - EL_GATE_4_GRAY_CLOSED, - EL_GATE_1_GRAY_OPEN, - EL_GATE_2_GRAY_OPEN, - EL_GATE_3_GRAY_OPEN, - EL_GATE_4_GRAY_OPEN, - EL_EM_GATE_1_CLOSED, - EL_EM_GATE_2_CLOSED, - EL_EM_GATE_3_CLOSED, - EL_EM_GATE_4_CLOSED, - EL_EM_GATE_1_OPEN, - EL_EM_GATE_2_OPEN, - EL_EM_GATE_3_OPEN, - EL_EM_GATE_4_OPEN, - EL_EM_GATE_1_GRAY_CLOSED, - EL_EM_GATE_2_GRAY_CLOSED, - EL_EM_GATE_3_GRAY_CLOSED, - EL_EM_GATE_4_GRAY_CLOSED, - EL_EM_GATE_1_GRAY_OPEN, - EL_EM_GATE_2_GRAY_OPEN, - EL_EM_GATE_3_GRAY_OPEN, - EL_EM_GATE_4_GRAY_OPEN, - EL_SWITCHGATE_OPEN, - EL_SWITCHGATE_OPENING, - EL_SWITCHGATE_CLOSED, - EL_SWITCHGATE_CLOSING, - EL_TIMEGATE_OPEN, - EL_TIMEGATE_OPENING, - EL_TIMEGATE_CLOSED, - EL_TIMEGATE_CLOSING, - EL_TUBE_ANY, - EL_TUBE_VERTICAL, - EL_TUBE_HORIZONTAL, - EL_TUBE_VERTICAL_LEFT, - EL_TUBE_VERTICAL_RIGHT, - EL_TUBE_HORIZONTAL_UP, - EL_TUBE_HORIZONTAL_DOWN, - EL_TUBE_LEFT_UP, - EL_TUBE_LEFT_DOWN, - EL_TUBE_RIGHT_UP, - EL_TUBE_RIGHT_DOWN, + /* new elements */ + EL_YAMYAM, + EL_DARK_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON, + -1 + }; + + static int ep_dont_touch[] = + { + EL_BUG, + EL_SPACESHIP, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, -1 }; @@ -1335,46 +1253,38 @@ void InitElementProperties() EL_EMC_STEELWALL_3, EL_EMC_STEELWALL_4, EL_CRYSTAL, - EL_GATE_1_CLOSED, - EL_GATE_2_CLOSED, - EL_GATE_3_CLOSED, - EL_GATE_4_CLOSED, - EL_GATE_1_OPEN, - EL_GATE_2_OPEN, - EL_GATE_3_OPEN, - EL_GATE_4_OPEN, - EL_GATE_1_GRAY_CLOSED, - EL_GATE_2_GRAY_CLOSED, - EL_GATE_3_GRAY_CLOSED, - EL_GATE_4_GRAY_CLOSED, - EL_GATE_1_GRAY_OPEN, - EL_GATE_2_GRAY_OPEN, - EL_GATE_3_GRAY_OPEN, - EL_GATE_4_GRAY_OPEN, - EL_EM_GATE_1_CLOSED, - EL_EM_GATE_2_CLOSED, - EL_EM_GATE_3_CLOSED, - EL_EM_GATE_4_CLOSED, - EL_EM_GATE_1_OPEN, - EL_EM_GATE_2_OPEN, - EL_EM_GATE_3_OPEN, - EL_EM_GATE_4_OPEN, - EL_EM_GATE_1_GRAY_CLOSED, - EL_EM_GATE_2_GRAY_CLOSED, - EL_EM_GATE_3_GRAY_CLOSED, - EL_EM_GATE_4_GRAY_CLOSED, - EL_EM_GATE_1_GRAY_OPEN, - EL_EM_GATE_2_GRAY_OPEN, - EL_EM_GATE_3_GRAY_OPEN, - EL_EM_GATE_4_GRAY_OPEN, + EL_GATE_1, + EL_GATE_2, + EL_GATE_3, + EL_GATE_4, + EL_GATE_1_GRAY, + EL_GATE_2_GRAY, + EL_GATE_3_GRAY, + EL_GATE_4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1_GRAY, + EL_EM_GATE_2_GRAY, + EL_EM_GATE_3_GRAY, + EL_EM_GATE_4_GRAY, EL_SWITCHGATE_OPEN, EL_SWITCHGATE_OPENING, EL_SWITCHGATE_CLOSED, EL_SWITCHGATE_CLOSING, +#if 0 + EL_SWITCHGATE_SWITCH_UP, + EL_SWITCHGATE_SWITCH_DOWN, +#endif EL_TIMEGATE_OPEN, EL_TIMEGATE_OPENING, EL_TIMEGATE_CLOSED, EL_TIMEGATE_CLOSING, +#if 0 + EL_TIMEGATE_SWITCH, + EL_TIMEGATE_SWITCH_ACTIVE, +#endif EL_TUBE_ANY, EL_TUBE_VERTICAL, EL_TUBE_HORIZONTAL, @@ -1426,7 +1336,12 @@ void InitElementProperties() -1 }; - static int ep_enemy[] = + static int ep_can_change[] = + { + -1 + }; + + static int ep_can_move[] = { EL_BUG, EL_SPACESHIP, @@ -1436,94 +1351,15 @@ void InitElementProperties() EL_DARK_YAMYAM, EL_ROBOT, EL_PACMAN, + EL_MOLE, + EL_PENGUIN, + EL_PIG, + EL_DRAGON, + EL_SATELLITE, EL_SP_SNIKSNAK, EL_SP_ELECTRON, - -1 - }; - - static int ep_mauer[] = - { - EL_STEELWALL, - EL_GATE_1_CLOSED, - EL_GATE_2_CLOSED, - EL_GATE_3_CLOSED, - EL_GATE_4_CLOSED, - EL_GATE_1_OPEN, - EL_GATE_2_OPEN, - EL_GATE_3_OPEN, - EL_GATE_4_OPEN, - EL_GATE_1_GRAY_CLOSED, - EL_GATE_2_GRAY_CLOSED, - EL_GATE_3_GRAY_CLOSED, - EL_GATE_4_GRAY_CLOSED, - EL_GATE_1_GRAY_OPEN, - EL_GATE_2_GRAY_OPEN, - EL_GATE_3_GRAY_OPEN, - EL_GATE_4_GRAY_OPEN, - EL_EM_GATE_1_CLOSED, - EL_EM_GATE_2_CLOSED, - EL_EM_GATE_3_CLOSED, - EL_EM_GATE_4_CLOSED, - EL_EM_GATE_1_OPEN, - EL_EM_GATE_2_OPEN, - EL_EM_GATE_3_OPEN, - EL_EM_GATE_4_OPEN, - EL_EM_GATE_1_GRAY_CLOSED, - EL_EM_GATE_2_GRAY_CLOSED, - EL_EM_GATE_3_GRAY_CLOSED, - EL_EM_GATE_4_GRAY_CLOSED, - EL_EM_GATE_1_GRAY_OPEN, - EL_EM_GATE_2_GRAY_OPEN, - EL_EM_GATE_3_GRAY_OPEN, - EL_EM_GATE_4_GRAY_OPEN, - EL_EXIT_CLOSED, - EL_EXIT_OPENING, - EL_EXIT_OPEN, - EL_WALL, - EL_WALL_CRUMBLED, - EL_EXPANDABLE_WALL, - EL_EXPANDABLE_WALL_HORIZONTAL, - EL_EXPANDABLE_WALL_VERTICAL, - EL_EXPANDABLE_WALL_ANY, - EL_EXPANDABLE_WALL_GROWING, - EL_BD_WALL, - EL_SP_CHIP_SINGLE, - EL_SP_CHIP_LEFT, - EL_SP_CHIP_RIGHT, - EL_SP_CHIP_TOP, - EL_SP_CHIP_BOTTOM, - EL_SP_HARDWARE_GRAY, - EL_SP_HARDWARE_GREEN, - EL_SP_HARDWARE_BLUE, - EL_SP_HARDWARE_RED, - EL_SP_HARDWARE_YELLOW, - EL_SP_HARDWARE_BASE_1, - EL_SP_HARDWARE_BASE_2, - EL_SP_HARDWARE_BASE_3, - EL_SP_HARDWARE_BASE_4, - EL_SP_HARDWARE_BASE_5, - EL_SP_HARDWARE_BASE_6, - EL_SP_TERMINAL, - EL_SP_TERMINAL_ACTIVE, - EL_SP_EXIT_CLOSED, - EL_SP_EXIT_OPEN, - EL_INVISIBLE_STEELWALL, - EL_INVISIBLE_STEELWALL_ACTIVE, - EL_INVISIBLE_WALL, - EL_INVISIBLE_WALL_ACTIVE, - EL_STEELWALL_SLANTED, - EL_EMC_STEELWALL_1, - EL_EMC_STEELWALL_2, - EL_EMC_STEELWALL_3, - EL_EMC_STEELWALL_4, - EL_EMC_WALL_1, - EL_EMC_WALL_2, - EL_EMC_WALL_3, - EL_EMC_WALL_4, - EL_EMC_WALL_5, - EL_EMC_WALL_6, - EL_EMC_WALL_7, - EL_EMC_WALL_8, + EL_BALLOON, + EL_SPRING, -1 }; @@ -1555,7 +1391,7 @@ void InitElementProperties() -1 }; - static int ep_can_smash[] = + static int ep_can_smash_player[] = { EL_ROCK, EL_BD_ROCK, @@ -1580,257 +1416,275 @@ void InitElementProperties() -1 }; - static int ep_can_change[] = + static int ep_can_smash_enemies[] = { EL_ROCK, EL_BD_ROCK, - EL_EMERALD, - EL_BD_DIAMOND, - EL_EMERALD_YELLOW, - EL_EMERALD_RED, - EL_EMERALD_PURPLE, - EL_DIAMOND, + EL_SP_ZONK, -1 }; - static int ep_can_move[] = + static int ep_can_smash_everything[] = { - EL_BUG, - EL_SPACESHIP, - EL_BD_BUTTERFLY, - EL_BD_FIREFLY, - EL_YAMYAM, - EL_DARK_YAMYAM, - EL_ROBOT, - EL_PACMAN, - EL_MOLE, - EL_PENGUIN, + EL_ROCK, + EL_BD_ROCK, + EL_SP_ZONK, + -1 + }; + + static int ep_can_explode_by_fire[] = + { + /* same elements as in 'ep_can_explode_impact' */ + EL_BOMB, + EL_SP_DISK_ORANGE, + EL_DX_SUPABOMB, + + /* same elements as in 'ep_can_explode_smashed' */ + EL_SATELLITE, EL_PIG, EL_DRAGON, - EL_SATELLITE, + EL_MOLE, + + /* new elements */ + EL_DYNAMITE_ACTIVE, + EL_DYNAMITE, + EL_DYNABOMB_PLAYER_1_ACTIVE, + EL_DYNABOMB_PLAYER_2_ACTIVE, + EL_DYNABOMB_PLAYER_3_ACTIVE, + EL_DYNABOMB_PLAYER_4_ACTIVE, + EL_DYNABOMB_INCREASE_NUMBER, + EL_DYNABOMB_INCREASE_SIZE, + EL_DYNABOMB_INCREASE_POWER, + EL_SP_DISK_RED_ACTIVE, + EL_BUG, + EL_PENGUIN, + EL_SP_DISK_RED, + EL_SP_DISK_YELLOW, EL_SP_SNIKSNAK, EL_SP_ELECTRON, - EL_BALLOON, - EL_SPRING, -1 }; - static int ep_could_move[] = - { - EL_BUG_RIGHT, - EL_BUG_UP, - EL_BUG_LEFT, - EL_BUG_DOWN, - EL_SPACESHIP_RIGHT, - EL_SPACESHIP_UP, - EL_SPACESHIP_LEFT, - EL_SPACESHIP_DOWN, - EL_BD_BUTTERFLY_RIGHT, - EL_BD_BUTTERFLY_UP, - EL_BD_BUTTERFLY_LEFT, - EL_BD_BUTTERFLY_DOWN, - EL_BD_FIREFLY_RIGHT, - EL_BD_FIREFLY_UP, - EL_BD_FIREFLY_LEFT, - EL_BD_FIREFLY_DOWN, - EL_PACMAN_RIGHT, - EL_PACMAN_UP, - EL_PACMAN_LEFT, - EL_PACMAN_DOWN, + static int ep_can_explode_smashed[] = + { + /* same elements as in 'ep_can_explode_impact' */ + EL_BOMB, + EL_SP_DISK_ORANGE, + EL_DX_SUPABOMB, + + /* new elements */ + EL_SATELLITE, + EL_PIG, + EL_DRAGON, + EL_MOLE, -1 }; - static int ep_dont_touch[] = + static int ep_can_explode_impact[] = { - EL_BUG, - EL_SPACESHIP, - EL_BD_BUTTERFLY, - EL_BD_FIREFLY, + EL_BOMB, + EL_SP_DISK_ORANGE, + EL_DX_SUPABOMB, -1 }; - static int ep_dont_go_to[] = + static int ep_walkable_over[] = { - EL_BUG, - EL_SPACESHIP, - EL_BD_BUTTERFLY, - EL_BD_FIREFLY, - EL_YAMYAM, - EL_DARK_YAMYAM, - EL_ROBOT, - EL_PACMAN, - EL_AMOEBA_DROP, - EL_ACID, - EL_SP_SNIKSNAK, - EL_SP_ELECTRON, - EL_SP_BUGGY_BASE_ACTIVE, - EL_TRAP_ACTIVE, - EL_LANDMINE, + EL_EMPTY_SPACE, + EL_SP_EMPTY_SPACE, + EL_SOKOBAN_FIELD_EMPTY, + EL_EXIT_OPEN, + EL_SP_EXIT_OPEN, + EL_GATE_1, + EL_GATE_2, + EL_GATE_3, + EL_GATE_4, + EL_GATE_1_GRAY, + EL_GATE_2_GRAY, + EL_GATE_3_GRAY, + EL_GATE_4_GRAY, -1 }; - static int ep_food_dark_yamyam[] = + static int ep_walkable_inside[] = { - EL_SAND, - EL_BUG, - EL_SPACESHIP, - EL_BD_BUTTERFLY, - EL_BD_FIREFLY, - EL_YAMYAM, - EL_ROBOT, - EL_PACMAN, - EL_AMOEBA_DROP, - EL_AMOEBA_DEAD, - EL_AMOEBA_WET, - EL_AMOEBA_DRY, - EL_AMOEBA_FULL, - EL_BD_AMOEBA, - EL_EMERALD, - EL_BD_DIAMOND, - EL_EMERALD_YELLOW, - EL_EMERALD_RED, - EL_EMERALD_PURPLE, - EL_DIAMOND, - EL_PEARL, - EL_CRYSTAL, + EL_TUBE_ANY, + EL_TUBE_VERTICAL, + EL_TUBE_HORIZONTAL, + EL_TUBE_VERTICAL_LEFT, + EL_TUBE_VERTICAL_RIGHT, + EL_TUBE_HORIZONTAL_UP, + EL_TUBE_HORIZONTAL_DOWN, + EL_TUBE_LEFT_UP, + EL_TUBE_LEFT_DOWN, + EL_TUBE_RIGHT_UP, + EL_TUBE_RIGHT_DOWN, -1 }; - static int ep_bd_element[] = + static int ep_walkable_under[] = { - EL_EMPTY, - EL_SAND, - EL_WALL_CRUMBLED, - EL_BD_WALL, - EL_ROCK, - EL_BD_ROCK, - EL_BD_DIAMOND, - EL_BD_MAGIC_WALL, - EL_EXIT_CLOSED, - EL_EXIT_OPEN, - EL_STEELWALL, - EL_PLAYER_1, - EL_BD_FIREFLY, - EL_BD_FIREFLY_1, - EL_BD_FIREFLY_2, - EL_BD_FIREFLY_3, - EL_BD_FIREFLY_4, - EL_BD_BUTTERFLY, - EL_BD_BUTTERFLY_1, - EL_BD_BUTTERFLY_2, - EL_BD_BUTTERFLY_3, - EL_BD_BUTTERFLY_4, - EL_BD_AMOEBA, - EL_CHAR_QUESTION, -1 }; - static int ep_sb_element[] = + static int ep_passable_over[] = { - EL_EMPTY, - EL_STEELWALL, - EL_SOKOBAN_OBJECT, - EL_SOKOBAN_FIELD_EMPTY, - EL_SOKOBAN_FIELD_FULL, - EL_PLAYER_1, - EL_INVISIBLE_STEELWALL, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1_GRAY, + EL_EM_GATE_2_GRAY, + EL_EM_GATE_3_GRAY, + EL_EM_GATE_4_GRAY, + EL_SWITCHGATE_OPEN, + EL_TIMEGATE_OPEN, -1 }; - static int ep_gem[] = + static int ep_passable_inside[] = { - EL_EMERALD, - EL_BD_DIAMOND, - EL_EMERALD_YELLOW, - EL_EMERALD_RED, - EL_EMERALD_PURPLE, - EL_DIAMOND, + EL_SP_PORT_LEFT, + EL_SP_PORT_RIGHT, + EL_SP_PORT_UP, + EL_SP_PORT_DOWN, + EL_SP_PORT_HORIZONTAL, + EL_SP_PORT_VERTICAL, + EL_SP_PORT_ANY, + EL_SP_GRAVITY_PORT_LEFT, + EL_SP_GRAVITY_PORT_RIGHT, + EL_SP_GRAVITY_PORT_UP, + EL_SP_GRAVITY_PORT_DOWN, -1 }; - static int ep_inactive[] = + static int ep_passable_under[] = { - EL_EMPTY, - EL_SAND, - EL_WALL, - EL_BD_WALL, - EL_WALL_CRUMBLED, - EL_STEELWALL, - EL_AMOEBA_DEAD, - EL_QUICKSAND_EMPTY, - EL_STONEBLOCK, - EL_ROBOT_WHEEL, - EL_KEY_1, - EL_KEY_2, - EL_KEY_3, - EL_KEY_4, - EL_EM_KEY_1, - EL_EM_KEY_2, - EL_EM_KEY_3, - EL_EM_KEY_4, - EL_GATE_1_CLOSED, - EL_GATE_2_CLOSED, - EL_GATE_3_CLOSED, - EL_GATE_4_CLOSED, - EL_GATE_1_OPEN, - EL_GATE_2_OPEN, - EL_GATE_3_OPEN, - EL_GATE_4_OPEN, - EL_GATE_1_GRAY_CLOSED, - EL_GATE_2_GRAY_CLOSED, - EL_GATE_3_GRAY_CLOSED, - EL_GATE_4_GRAY_CLOSED, - EL_GATE_1_GRAY_OPEN, - EL_GATE_2_GRAY_OPEN, - EL_GATE_3_GRAY_OPEN, - EL_GATE_4_GRAY_OPEN, - EL_EM_GATE_1_CLOSED, - EL_EM_GATE_2_CLOSED, - EL_EM_GATE_3_CLOSED, - EL_EM_GATE_4_CLOSED, - EL_EM_GATE_1_OPEN, - EL_EM_GATE_2_OPEN, - EL_EM_GATE_3_OPEN, - EL_EM_GATE_4_OPEN, - EL_EM_GATE_1_GRAY_CLOSED, - EL_EM_GATE_2_GRAY_CLOSED, - EL_EM_GATE_3_GRAY_CLOSED, - EL_EM_GATE_4_GRAY_CLOSED, - EL_EM_GATE_1_GRAY_OPEN, - EL_EM_GATE_2_GRAY_OPEN, - EL_EM_GATE_3_GRAY_OPEN, - EL_EM_GATE_4_GRAY_OPEN, - EL_DYNAMITE, - EL_INVISIBLE_STEELWALL, - EL_INVISIBLE_WALL, - EL_INVISIBLE_SAND, - EL_LAMP, - EL_LAMP_ACTIVE, - EL_WALL_EMERALD, - EL_WALL_DIAMOND, - EL_WALL_BD_DIAMOND, - EL_WALL_EMERALD_YELLOW, - EL_DYNABOMB_INCREASE_NUMBER, - EL_DYNABOMB_INCREASE_SIZE, - EL_DYNABOMB_INCREASE_POWER, + -1 + }; + + static int ep_pushable[] = + { + EL_ROCK, + EL_BOMB, + EL_DX_SUPABOMB, + EL_NUT, + EL_TIME_ORB_EMPTY, + EL_SP_ZONK, + EL_SP_DISK_ORANGE, + EL_SPRING, + EL_BD_ROCK, EL_SOKOBAN_OBJECT, - EL_SOKOBAN_FIELD_EMPTY, EL_SOKOBAN_FIELD_FULL, - EL_WALL_EMERALD_RED, - EL_WALL_EMERALD_PURPLE, - EL_ACID_POOL_TOPLEFT, - EL_ACID_POOL_TOPRIGHT, - EL_ACID_POOL_BOTTOMLEFT, - EL_ACID_POOL_BOTTOM, - EL_ACID_POOL_BOTTOMRIGHT, - EL_MAGIC_WALL, - EL_MAGIC_WALL_DEAD, + EL_SATELLITE, + EL_SP_DISK_YELLOW, + EL_BALLOON, + -1 + }; + + static int ep_can_be_crumbled[] = + { + EL_SAND, + EL_LANDMINE, + EL_TRAP, + EL_TRAP_ACTIVE, + -1 + }; + + static int ep_player[] = + { + EL_PLAYER_1, + EL_PLAYER_2, + EL_PLAYER_3, + EL_PLAYER_4, + -1 + }; + + static int ep_can_pass_magic_wall[] = + { + EL_ROCK, + EL_BD_ROCK, + EL_EMERALD, + EL_BD_DIAMOND, + EL_EMERALD_YELLOW, + EL_EMERALD_RED, + EL_EMERALD_PURPLE, + EL_DIAMOND, + -1 + }; + + static int ep_switchable[] = + { + EL_ROBOT_WHEEL, + EL_SP_TERMINAL, + EL_CONVEYOR_BELT_1_SWITCH_LEFT, + EL_CONVEYOR_BELT_1_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_1_SWITCH_RIGHT, + EL_CONVEYOR_BELT_2_SWITCH_LEFT, + EL_CONVEYOR_BELT_2_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_2_SWITCH_RIGHT, + EL_CONVEYOR_BELT_3_SWITCH_LEFT, + EL_CONVEYOR_BELT_3_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_3_SWITCH_RIGHT, + EL_CONVEYOR_BELT_4_SWITCH_LEFT, + EL_CONVEYOR_BELT_4_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_4_SWITCH_RIGHT, + EL_SWITCHGATE_SWITCH_UP, + EL_SWITCHGATE_SWITCH_DOWN, + EL_LIGHT_SWITCH, + EL_LIGHT_SWITCH_ACTIVE, + EL_TIMEGATE_SWITCH, + EL_BALLOON_SWITCH_LEFT, + EL_BALLOON_SWITCH_RIGHT, + EL_BALLOON_SWITCH_UP, + EL_BALLOON_SWITCH_DOWN, + EL_BALLOON_SWITCH_ANY, + EL_LAMP, + EL_TIME_ORB_FULL, + -1 + }; + + static int ep_bd_element[] = + { + EL_EMPTY, + EL_SAND, + EL_WALL_CRUMBLED, + EL_BD_WALL, + EL_ROCK, + EL_BD_ROCK, + EL_BD_DIAMOND, EL_BD_MAGIC_WALL, - EL_BD_MAGIC_WALL_DEAD, - EL_AMOEBA_TO_DIAMOND, - EL_BLOCKED, + EL_EXIT_CLOSED, + EL_EXIT_OPEN, + EL_STEELWALL, + EL_PLAYER_1, + EL_BD_FIREFLY, + EL_BD_FIREFLY_1, + EL_BD_FIREFLY_2, + EL_BD_FIREFLY_3, + EL_BD_FIREFLY_4, + EL_BD_BUTTERFLY, + EL_BD_BUTTERFLY_1, + EL_BD_BUTTERFLY_2, + EL_BD_BUTTERFLY_3, + EL_BD_BUTTERFLY_4, + EL_BD_AMOEBA, + EL_CHAR_QUESTION, + -1 + }; + + static int ep_sp_element[] = + { EL_SP_EMPTY, + EL_SP_ZONK, EL_SP_BASE, + EL_SP_MURPHY, + EL_SP_INFOTRON, + EL_SP_CHIP_SINGLE, + EL_SP_HARDWARE_GRAY, + EL_SP_EXIT_CLOSED, + EL_SP_EXIT_OPEN, + EL_SP_DISK_ORANGE, EL_SP_PORT_RIGHT, EL_SP_PORT_DOWN, EL_SP_PORT_LEFT, @@ -1839,92 +1693,83 @@ void InitElementProperties() EL_SP_GRAVITY_PORT_DOWN, EL_SP_GRAVITY_PORT_LEFT, EL_SP_GRAVITY_PORT_UP, - EL_SP_PORT_HORIZONTAL, + EL_SP_SNIKSNAK, + EL_SP_DISK_YELLOW, + EL_SP_TERMINAL, + EL_SP_DISK_RED, EL_SP_PORT_VERTICAL, + EL_SP_PORT_HORIZONTAL, EL_SP_PORT_ANY, - EL_SP_DISK_RED, - EL_SP_DISK_YELLOW, - EL_SP_CHIP_SINGLE, + EL_SP_ELECTRON, + EL_SP_BUGGY_BASE, EL_SP_CHIP_LEFT, EL_SP_CHIP_RIGHT, - EL_SP_CHIP_TOP, - EL_SP_CHIP_BOTTOM, - EL_SP_HARDWARE_GRAY, + EL_SP_HARDWARE_BASE_1, EL_SP_HARDWARE_GREEN, EL_SP_HARDWARE_BLUE, EL_SP_HARDWARE_RED, EL_SP_HARDWARE_YELLOW, - EL_SP_HARDWARE_BASE_1, EL_SP_HARDWARE_BASE_2, EL_SP_HARDWARE_BASE_3, EL_SP_HARDWARE_BASE_4, EL_SP_HARDWARE_BASE_5, EL_SP_HARDWARE_BASE_6, - EL_CONVEYOR_BELT_1_SWITCH_LEFT, - EL_CONVEYOR_BELT_1_SWITCH_MIDDLE, - EL_CONVEYOR_BELT_1_SWITCH_RIGHT, - EL_CONVEYOR_BELT_2_SWITCH_LEFT, - EL_CONVEYOR_BELT_2_SWITCH_MIDDLE, - EL_CONVEYOR_BELT_2_SWITCH_RIGHT, - EL_CONVEYOR_BELT_3_SWITCH_LEFT, - EL_CONVEYOR_BELT_3_SWITCH_MIDDLE, - EL_CONVEYOR_BELT_3_SWITCH_RIGHT, - EL_CONVEYOR_BELT_4_SWITCH_LEFT, - EL_CONVEYOR_BELT_4_SWITCH_MIDDLE, - EL_CONVEYOR_BELT_4_SWITCH_RIGHT, - EL_SIGN_EXCLAMATION, - EL_SIGN_RADIOACTIVITY, - EL_SIGN_STOP, - EL_SIGN_WHEELCHAIR, - EL_SIGN_PARKING, - EL_SIGN_ONEWAY, - EL_SIGN_HEART, - EL_SIGN_TRIANGLE, - EL_SIGN_ROUND, - EL_SIGN_EXIT, - EL_SIGN_YINYANG, - EL_SIGN_OTHER, - EL_STEELWALL_SLANTED, - EL_EMC_STEELWALL_1, - EL_EMC_STEELWALL_2, - EL_EMC_STEELWALL_3, - EL_EMC_STEELWALL_4, - EL_EMC_WALL_1, - EL_EMC_WALL_2, - EL_EMC_WALL_3, - EL_EMC_WALL_4, - EL_EMC_WALL_5, - EL_EMC_WALL_6, - EL_EMC_WALL_7, - EL_EMC_WALL_8, + EL_SP_CHIP_TOP, + EL_SP_CHIP_BOTTOM, + /* additional elements that appeared in newer Supaplex levels */ + EL_INVISIBLE_WALL, + /* more than one murphy in a level results in an inactive clone */ + EL_SP_MURPHY_CLONE, -1 }; - static int ep_explosive[] = + static int ep_sb_element[] = { - EL_BOMB, - EL_DYNAMITE_ACTIVE, - EL_DYNAMITE, - EL_DYNABOMB_PLAYER_1_ACTIVE, - EL_DYNABOMB_PLAYER_2_ACTIVE, - EL_DYNABOMB_PLAYER_3_ACTIVE, - EL_DYNABOMB_PLAYER_4_ACTIVE, - EL_DYNABOMB_INCREASE_NUMBER, - EL_DYNABOMB_INCREASE_SIZE, - EL_DYNABOMB_INCREASE_POWER, - EL_SP_DISK_RED_ACTIVE, + EL_EMPTY, + EL_STEELWALL, + EL_SOKOBAN_OBJECT, + EL_SOKOBAN_FIELD_EMPTY, + EL_SOKOBAN_FIELD_FULL, + EL_PLAYER_1, + EL_INVISIBLE_STEELWALL, + -1 + }; + + static int ep_gem[] = + { + EL_BD_DIAMOND, + EL_EMERALD, + EL_EMERALD_YELLOW, + EL_EMERALD_RED, + EL_EMERALD_PURPLE, + EL_DIAMOND, + -1 + }; + + static int ep_food_dark_yamyam[] = + { + EL_SAND, EL_BUG, - EL_MOLE, - EL_PENGUIN, - EL_PIG, - EL_DRAGON, - EL_SATELLITE, - EL_SP_DISK_RED, - EL_SP_DISK_ORANGE, - EL_SP_DISK_YELLOW, - EL_SP_SNIKSNAK, - EL_SP_ELECTRON, - EL_DX_SUPABOMB, + EL_SPACESHIP, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, + EL_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_AMOEBA_DROP, + EL_AMOEBA_DEAD, + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA, + EL_EMERALD, + EL_BD_DIAMOND, + EL_EMERALD_YELLOW, + EL_EMERALD_RED, + EL_EMERALD_PURPLE, + EL_DIAMOND, + EL_PEARL, + EL_CRYSTAL, -1 }; @@ -1941,54 +1786,228 @@ void InitElementProperties() -1 }; - static int ep_pushable[] = + static int ep_food_pig[] = { - EL_ROCK, - EL_BD_ROCK, - EL_BOMB, - EL_NUT, - EL_TIME_ORB_EMPTY, - EL_SOKOBAN_FIELD_FULL, - EL_SOKOBAN_OBJECT, - EL_SATELLITE, - EL_SP_ZONK, - EL_SP_DISK_ORANGE, - EL_SP_DISK_YELLOW, - EL_BALLOON, - EL_SPRING, - EL_DX_SUPABOMB, + EL_EMERALD, + EL_BD_DIAMOND, + EL_EMERALD_YELLOW, + EL_EMERALD_RED, + EL_EMERALD_PURPLE, + EL_DIAMOND, -1 }; - static int ep_player[] = + static int ep_historic_wall[] = { - EL_PLAYER_1, - EL_PLAYER_2, - EL_PLAYER_3, - EL_PLAYER_4, + EL_STEELWALL, + EL_GATE_1, + EL_GATE_2, + EL_GATE_3, + EL_GATE_4, + EL_GATE_1_GRAY, + EL_GATE_2_GRAY, + EL_GATE_3_GRAY, + EL_GATE_4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1_GRAY, + EL_EM_GATE_2_GRAY, + EL_EM_GATE_3_GRAY, + EL_EM_GATE_4_GRAY, + EL_EXIT_CLOSED, + EL_EXIT_OPENING, + EL_EXIT_OPEN, + EL_WALL, + EL_WALL_CRUMBLED, + EL_EXPANDABLE_WALL, + EL_EXPANDABLE_WALL_HORIZONTAL, + EL_EXPANDABLE_WALL_VERTICAL, + EL_EXPANDABLE_WALL_ANY, + EL_EXPANDABLE_WALL_GROWING, + EL_BD_WALL, + EL_SP_CHIP_SINGLE, + EL_SP_CHIP_LEFT, + EL_SP_CHIP_RIGHT, + EL_SP_CHIP_TOP, + EL_SP_CHIP_BOTTOM, + EL_SP_HARDWARE_GRAY, + EL_SP_HARDWARE_GREEN, + EL_SP_HARDWARE_BLUE, + EL_SP_HARDWARE_RED, + EL_SP_HARDWARE_YELLOW, + EL_SP_HARDWARE_BASE_1, + EL_SP_HARDWARE_BASE_2, + EL_SP_HARDWARE_BASE_3, + EL_SP_HARDWARE_BASE_4, + EL_SP_HARDWARE_BASE_5, + EL_SP_HARDWARE_BASE_6, + EL_SP_TERMINAL, + EL_SP_TERMINAL_ACTIVE, + EL_SP_EXIT_CLOSED, + EL_SP_EXIT_OPEN, + EL_INVISIBLE_STEELWALL, + EL_INVISIBLE_STEELWALL_ACTIVE, + EL_INVISIBLE_WALL, + EL_INVISIBLE_WALL_ACTIVE, + EL_STEELWALL_SLANTED, + EL_EMC_STEELWALL_1, + EL_EMC_STEELWALL_2, + EL_EMC_STEELWALL_3, + EL_EMC_STEELWALL_4, + EL_EMC_WALL_1, + EL_EMC_WALL_2, + EL_EMC_WALL_3, + EL_EMC_WALL_4, + EL_EMC_WALL_5, + EL_EMC_WALL_6, + EL_EMC_WALL_7, + EL_EMC_WALL_8, -1 }; - static int ep_walkable_over[] = + static int ep_historic_solid[] = { - EL_EMPTY_SPACE, - EL_SP_EMPTY_SPACE, - EL_SOKOBAN_FIELD_EMPTY, + EL_WALL, + EL_EXPANDABLE_WALL, + EL_EXPANDABLE_WALL_HORIZONTAL, + EL_EXPANDABLE_WALL_VERTICAL, + EL_EXPANDABLE_WALL_ANY, + EL_BD_WALL, + EL_WALL_CRUMBLED, + EL_EXIT_CLOSED, + EL_EXIT_OPENING, EL_EXIT_OPEN, + EL_AMOEBA_DEAD, + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA, + EL_QUICKSAND_EMPTY, + EL_QUICKSAND_FULL, + EL_QUICKSAND_FILLING, + EL_QUICKSAND_EMPTYING, + EL_MAGIC_WALL, + EL_MAGIC_WALL_ACTIVE, + EL_MAGIC_WALL_EMPTYING, + EL_MAGIC_WALL_FILLING, + EL_MAGIC_WALL_FULL, + EL_MAGIC_WALL_DEAD, + EL_BD_MAGIC_WALL, + EL_BD_MAGIC_WALL_ACTIVE, + EL_BD_MAGIC_WALL_EMPTYING, + EL_BD_MAGIC_WALL_FULL, + EL_BD_MAGIC_WALL_FILLING, + EL_BD_MAGIC_WALL_DEAD, + EL_GAME_OF_LIFE, + EL_BIOMAZE, + EL_SP_CHIP_SINGLE, + EL_SP_CHIP_LEFT, + EL_SP_CHIP_RIGHT, + EL_SP_CHIP_TOP, + EL_SP_CHIP_BOTTOM, + EL_SP_TERMINAL, + EL_SP_TERMINAL_ACTIVE, + EL_SP_EXIT_CLOSED, EL_SP_EXIT_OPEN, - EL_GATE_1_OPEN, - EL_GATE_2_OPEN, - EL_GATE_3_OPEN, - EL_GATE_4_OPEN, - EL_GATE_1_GRAY_OPEN, - EL_GATE_2_GRAY_OPEN, - EL_GATE_3_GRAY_OPEN, - EL_GATE_4_GRAY_OPEN, - -1 - }; + EL_INVISIBLE_WALL, + EL_INVISIBLE_WALL_ACTIVE, + EL_SWITCHGATE_SWITCH_UP, + EL_SWITCHGATE_SWITCH_DOWN, + EL_TIMEGATE_SWITCH, + EL_TIMEGATE_SWITCH_ACTIVE, + EL_EMC_WALL_1, + EL_EMC_WALL_2, + EL_EMC_WALL_3, + EL_EMC_WALL_4, + EL_EMC_WALL_5, + EL_EMC_WALL_6, + EL_EMC_WALL_7, + EL_EMC_WALL_8, + EL_WALL_PEARL, + EL_WALL_CRYSTAL, - static int ep_walkable_inside[] = - { + /* the following elements are a direct copy of "indestructible" elements, + except "EL_ACID", which is "indestructible", but not "solid"! */ +#if 0 + EL_ACID, +#endif + EL_STEELWALL, + EL_ACID_POOL_TOPLEFT, + EL_ACID_POOL_TOPRIGHT, + EL_ACID_POOL_BOTTOMLEFT, + EL_ACID_POOL_BOTTOM, + EL_ACID_POOL_BOTTOMRIGHT, + EL_SP_HARDWARE_GRAY, + EL_SP_HARDWARE_GREEN, + EL_SP_HARDWARE_BLUE, + EL_SP_HARDWARE_RED, + EL_SP_HARDWARE_YELLOW, + EL_SP_HARDWARE_BASE_1, + EL_SP_HARDWARE_BASE_2, + EL_SP_HARDWARE_BASE_3, + EL_SP_HARDWARE_BASE_4, + EL_SP_HARDWARE_BASE_5, + EL_SP_HARDWARE_BASE_6, + EL_INVISIBLE_STEELWALL, + EL_INVISIBLE_STEELWALL_ACTIVE, + EL_CONVEYOR_BELT_1_SWITCH_LEFT, + EL_CONVEYOR_BELT_1_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_1_SWITCH_RIGHT, + EL_CONVEYOR_BELT_2_SWITCH_LEFT, + EL_CONVEYOR_BELT_2_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_2_SWITCH_RIGHT, + EL_CONVEYOR_BELT_3_SWITCH_LEFT, + EL_CONVEYOR_BELT_3_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_3_SWITCH_RIGHT, + EL_CONVEYOR_BELT_4_SWITCH_LEFT, + EL_CONVEYOR_BELT_4_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_4_SWITCH_RIGHT, + EL_LIGHT_SWITCH, + EL_LIGHT_SWITCH_ACTIVE, + EL_SIGN_EXCLAMATION, + EL_SIGN_RADIOACTIVITY, + EL_SIGN_STOP, + EL_SIGN_WHEELCHAIR, + EL_SIGN_PARKING, + EL_SIGN_ONEWAY, + EL_SIGN_HEART, + EL_SIGN_TRIANGLE, + EL_SIGN_ROUND, + EL_SIGN_EXIT, + EL_SIGN_YINYANG, + EL_SIGN_OTHER, + EL_STEELWALL_SLANTED, + EL_EMC_STEELWALL_1, + EL_EMC_STEELWALL_2, + EL_EMC_STEELWALL_3, + EL_EMC_STEELWALL_4, + EL_CRYSTAL, + EL_GATE_1, + EL_GATE_2, + EL_GATE_3, + EL_GATE_4, + EL_GATE_1_GRAY, + EL_GATE_2_GRAY, + EL_GATE_3_GRAY, + EL_GATE_4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1_GRAY, + EL_EM_GATE_2_GRAY, + EL_EM_GATE_3_GRAY, + EL_EM_GATE_4_GRAY, + EL_SWITCHGATE_OPEN, + EL_SWITCHGATE_OPENING, + EL_SWITCHGATE_CLOSED, + EL_SWITCHGATE_CLOSING, + EL_TIMEGATE_OPEN, + EL_TIMEGATE_OPENING, + EL_TIMEGATE_CLOSED, + EL_TIMEGATE_CLOSING, EL_TUBE_ANY, EL_TUBE_VERTICAL, EL_TUBE_HORIZONTAL, @@ -2003,104 +2022,19 @@ void InitElementProperties() -1 }; - static int ep_walkable_under[] = - { - -1 - }; - - static int ep_passable_over[] = - { - EL_EM_GATE_1_OPEN, - EL_EM_GATE_2_OPEN, - EL_EM_GATE_3_OPEN, - EL_EM_GATE_4_OPEN, - EL_EM_GATE_1_GRAY_OPEN, - EL_EM_GATE_2_GRAY_OPEN, - EL_EM_GATE_3_GRAY_OPEN, - EL_EM_GATE_4_GRAY_OPEN, - EL_SWITCHGATE_OPEN, - EL_TIMEGATE_OPEN, - -1 - }; - - static int ep_passable_inside[] = - { - EL_SP_PORT_LEFT, - EL_SP_PORT_RIGHT, - EL_SP_PORT_UP, - EL_SP_PORT_DOWN, - EL_SP_PORT_HORIZONTAL, - EL_SP_PORT_VERTICAL, - EL_SP_PORT_ANY, - EL_SP_GRAVITY_PORT_LEFT, - EL_SP_GRAVITY_PORT_RIGHT, - EL_SP_GRAVITY_PORT_UP, - EL_SP_GRAVITY_PORT_DOWN, - -1 - }; - - static int ep_passable_under[] = - { - -1 - }; - - static int ep_diggable[] = - { - EL_SAND, - EL_SP_BASE, - EL_SP_BUGGY_BASE, - EL_SP_BUGGY_BASE_ACTIVATING, - EL_TRAP, - EL_INVISIBLE_SAND, - EL_INVISIBLE_SAND_ACTIVE, -#if 0 - EL_LANDMINE, - EL_SP_BUGGY_BASE_ACTIVE, -#endif - -1 - }; - - static int ep_collectible[] = + static int ep_classic_enemy[] = { - EL_BD_DIAMOND, - EL_EMERALD, - EL_DIAMOND, - EL_EMERALD_YELLOW, - EL_EMERALD_RED, - EL_EMERALD_PURPLE, - EL_KEY_1, - EL_KEY_2, - EL_KEY_3, - EL_KEY_4, - EL_EM_KEY_1, - EL_EM_KEY_2, - EL_EM_KEY_3, - EL_EM_KEY_4, - EL_DYNAMITE, - EL_DYNABOMB_INCREASE_NUMBER, - EL_DYNABOMB_INCREASE_SIZE, - EL_DYNABOMB_INCREASE_POWER, - EL_SP_INFOTRON, - EL_SP_DISK_RED, - EL_PEARL, - EL_CRYSTAL, - EL_KEY_WHITE, - EL_SHIELD_NORMAL, - EL_SHIELD_DEADLY, - EL_EXTRA_TIME, - EL_ENVELOPE, - EL_SPEED_PILL, - -1 - }; + EL_BUG, + EL_SPACESHIP, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, - static int ep_active_bomb[] = - { - EL_DYNAMITE_ACTIVE, - EL_DYNABOMB_PLAYER_1_ACTIVE, - EL_DYNABOMB_PLAYER_2_ACTIVE, - EL_DYNABOMB_PLAYER_3_ACTIVE, - EL_DYNABOMB_PLAYER_4_ACTIVE, - EL_SP_DISK_RED_ACTIVE, + EL_YAMYAM, + EL_DARK_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON, -1 }; @@ -2155,18 +2089,150 @@ void InitElementProperties() -1 }; - static int ep_sp_element[] = + static int ep_tube[] = + { + EL_TUBE_LEFT_UP, + EL_TUBE_LEFT_DOWN, + EL_TUBE_RIGHT_UP, + EL_TUBE_RIGHT_DOWN, + EL_TUBE_HORIZONTAL, + EL_TUBE_HORIZONTAL_UP, + EL_TUBE_HORIZONTAL_DOWN, + EL_TUBE_VERTICAL, + EL_TUBE_VERTICAL_LEFT, + EL_TUBE_VERTICAL_RIGHT, + EL_TUBE_ANY, + -1 + }; + + static int ep_keygate[] = + { + EL_GATE_1, + EL_GATE_2, + EL_GATE_3, + EL_GATE_4, + EL_GATE_1_GRAY, + EL_GATE_2_GRAY, + EL_GATE_3_GRAY, + EL_GATE_4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1_GRAY, + EL_EM_GATE_2_GRAY, + EL_EM_GATE_3_GRAY, + EL_EM_GATE_4_GRAY, + -1 + }; + + static int ep_amoeboid[] = + { + EL_AMOEBA_DEAD, + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA, + -1 + }; + + static int ep_amoebalive[] = + { + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA, + -1 + }; + + static int ep_has_content[] = { + EL_YAMYAM, + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA, + -1 + }; + + static int ep_active_bomb[] = + { + EL_DYNAMITE_ACTIVE, + EL_DYNABOMB_PLAYER_1_ACTIVE, + EL_DYNABOMB_PLAYER_2_ACTIVE, + EL_DYNABOMB_PLAYER_3_ACTIVE, + EL_DYNABOMB_PLAYER_4_ACTIVE, + EL_SP_DISK_RED_ACTIVE, + -1 + }; + + static int ep_inactive[] = + { + EL_EMPTY, + EL_SAND, + EL_WALL, + EL_BD_WALL, + EL_WALL_CRUMBLED, + EL_STEELWALL, + EL_AMOEBA_DEAD, + EL_QUICKSAND_EMPTY, + EL_STONEBLOCK, + EL_ROBOT_WHEEL, + EL_KEY_1, + EL_KEY_2, + EL_KEY_3, + EL_KEY_4, + EL_EM_KEY_1, + EL_EM_KEY_2, + EL_EM_KEY_3, + EL_EM_KEY_4, + EL_GATE_1, + EL_GATE_2, + EL_GATE_3, + EL_GATE_4, + EL_GATE_1_GRAY, + EL_GATE_2_GRAY, + EL_GATE_3_GRAY, + EL_GATE_4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1_GRAY, + EL_EM_GATE_2_GRAY, + EL_EM_GATE_3_GRAY, + EL_EM_GATE_4_GRAY, + EL_DYNAMITE, + EL_INVISIBLE_STEELWALL, + EL_INVISIBLE_WALL, + EL_INVISIBLE_SAND, + EL_LAMP, + EL_LAMP_ACTIVE, + EL_WALL_EMERALD, + EL_WALL_DIAMOND, + EL_WALL_BD_DIAMOND, + EL_WALL_EMERALD_YELLOW, + EL_DYNABOMB_INCREASE_NUMBER, + EL_DYNABOMB_INCREASE_SIZE, + EL_DYNABOMB_INCREASE_POWER, + EL_SOKOBAN_OBJECT, + EL_SOKOBAN_FIELD_EMPTY, + EL_SOKOBAN_FIELD_FULL, + EL_WALL_EMERALD_RED, + EL_WALL_EMERALD_PURPLE, + EL_ACID_POOL_TOPLEFT, + EL_ACID_POOL_TOPRIGHT, + EL_ACID_POOL_BOTTOMLEFT, + EL_ACID_POOL_BOTTOM, + EL_ACID_POOL_BOTTOMRIGHT, + EL_MAGIC_WALL, + EL_MAGIC_WALL_DEAD, + EL_BD_MAGIC_WALL, + EL_BD_MAGIC_WALL_DEAD, + EL_AMOEBA_TO_DIAMOND, + EL_BLOCKED, EL_SP_EMPTY, - EL_SP_ZONK, EL_SP_BASE, - EL_SP_MURPHY, - EL_SP_INFOTRON, - EL_SP_CHIP_SINGLE, - EL_SP_HARDWARE_GRAY, - EL_SP_EXIT_CLOSED, - EL_SP_EXIT_OPEN, - EL_SP_DISK_ORANGE, EL_SP_PORT_RIGHT, EL_SP_PORT_DOWN, EL_SP_PORT_LEFT, @@ -2175,59 +2241,64 @@ void InitElementProperties() EL_SP_GRAVITY_PORT_DOWN, EL_SP_GRAVITY_PORT_LEFT, EL_SP_GRAVITY_PORT_UP, - EL_SP_SNIKSNAK, - EL_SP_DISK_YELLOW, - EL_SP_TERMINAL, - EL_SP_DISK_RED, - EL_SP_PORT_VERTICAL, EL_SP_PORT_HORIZONTAL, + EL_SP_PORT_VERTICAL, EL_SP_PORT_ANY, - EL_SP_ELECTRON, - EL_SP_BUGGY_BASE, + EL_SP_DISK_RED, + EL_SP_DISK_YELLOW, + EL_SP_CHIP_SINGLE, EL_SP_CHIP_LEFT, EL_SP_CHIP_RIGHT, - EL_SP_HARDWARE_BASE_1, + EL_SP_CHIP_TOP, + EL_SP_CHIP_BOTTOM, + EL_SP_HARDWARE_GRAY, EL_SP_HARDWARE_GREEN, EL_SP_HARDWARE_BLUE, EL_SP_HARDWARE_RED, EL_SP_HARDWARE_YELLOW, + EL_SP_HARDWARE_BASE_1, EL_SP_HARDWARE_BASE_2, EL_SP_HARDWARE_BASE_3, EL_SP_HARDWARE_BASE_4, EL_SP_HARDWARE_BASE_5, EL_SP_HARDWARE_BASE_6, - EL_SP_CHIP_TOP, - EL_SP_CHIP_BOTTOM, - /* additional elements that appeared in newer Supaplex levels */ - EL_INVISIBLE_WALL, - /* more than one murphy in a level results in an inactive clone */ - EL_SP_MURPHY_CLONE, - -1 - }; - - static int ep_has_content[] = - { - EL_YAMYAM, - EL_AMOEBA_WET, - EL_AMOEBA_DRY, - EL_AMOEBA_FULL, - EL_BD_AMOEBA, - -1 - }; - - static int ep_tube[] = - { - EL_TUBE_LEFT_UP, - EL_TUBE_LEFT_DOWN, - EL_TUBE_RIGHT_UP, - EL_TUBE_RIGHT_DOWN, - EL_TUBE_HORIZONTAL, - EL_TUBE_HORIZONTAL_UP, - EL_TUBE_HORIZONTAL_DOWN, - EL_TUBE_VERTICAL, - EL_TUBE_VERTICAL_LEFT, - EL_TUBE_VERTICAL_RIGHT, - EL_TUBE_ANY, + EL_CONVEYOR_BELT_1_SWITCH_LEFT, + EL_CONVEYOR_BELT_1_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_1_SWITCH_RIGHT, + EL_CONVEYOR_BELT_2_SWITCH_LEFT, + EL_CONVEYOR_BELT_2_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_2_SWITCH_RIGHT, + EL_CONVEYOR_BELT_3_SWITCH_LEFT, + EL_CONVEYOR_BELT_3_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_3_SWITCH_RIGHT, + EL_CONVEYOR_BELT_4_SWITCH_LEFT, + EL_CONVEYOR_BELT_4_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_4_SWITCH_RIGHT, + EL_SIGN_EXCLAMATION, + EL_SIGN_RADIOACTIVITY, + EL_SIGN_STOP, + EL_SIGN_WHEELCHAIR, + EL_SIGN_PARKING, + EL_SIGN_ONEWAY, + EL_SIGN_HEART, + EL_SIGN_TRIANGLE, + EL_SIGN_ROUND, + EL_SIGN_EXIT, + EL_SIGN_YINYANG, + EL_SIGN_OTHER, + EL_STEELWALL_SLANTED, + EL_EMC_STEELWALL_1, + EL_EMC_STEELWALL_2, + EL_EMC_STEELWALL_3, + EL_EMC_STEELWALL_4, + EL_EMC_WALL_1, + EL_EMC_WALL_2, + EL_EMC_WALL_3, + EL_EMC_WALL_4, + EL_EMC_WALL_5, + EL_EMC_WALL_6, + EL_EMC_WALL_7, + EL_EMC_WALL_8, -1 }; @@ -2237,67 +2308,131 @@ void InitElementProperties() int property; } element_properties[] = { - { ep_amoebalive, EP_AMOEBALIVE }, - { ep_amoeboid, EP_AMOEBOID }, - { ep_can_be_crumbled, EP_CAN_BE_CRUMBLED }, - { ep_solid, EP_SOLID }, + { ep_diggable, EP_DIGGABLE }, + { ep_collectible, EP_COLLECTIBLE }, + { ep_dont_run_into, EP_DONT_RUN_INTO }, + { ep_dont_collide_with, EP_DONT_COLLIDE_WITH }, + { ep_dont_touch, EP_DONT_TOUCH }, { ep_indestructible, EP_INDESTRUCTIBLE }, { ep_slippery, EP_SLIPPERY }, - { ep_enemy, EP_ENEMY }, - { ep_mauer, EP_MAUER }, - { ep_can_fall, EP_CAN_FALL }, - { ep_can_smash, EP_CAN_SMASH }, { ep_can_change, EP_CAN_CHANGE }, { ep_can_move, EP_CAN_MOVE }, - { ep_could_move, EP_COULD_MOVE }, - { ep_dont_touch, EP_DONT_TOUCH }, - { ep_dont_go_to, EP_DONT_GO_TO }, - { ep_food_dark_yamyam, EP_FOOD_DARK_YAMYAM }, - { ep_bd_element, EP_BD_ELEMENT }, - { ep_sb_element, EP_SB_ELEMENT }, - { ep_gem, EP_GEM }, - { ep_inactive, EP_INACTIVE }, - { ep_explosive, EP_EXPLOSIVE }, - { ep_food_penguin, EP_FOOD_PENGUIN }, - { ep_pushable, EP_PUSHABLE }, - { ep_player, EP_PLAYER }, + { ep_can_fall, EP_CAN_FALL }, + { ep_can_smash_player, EP_CAN_SMASH_PLAYER }, + { ep_can_smash_enemies, EP_CAN_SMASH_ENEMIES }, + { ep_can_smash_everything, EP_CAN_SMASH_EVERYTHING }, + { ep_can_explode_by_fire, EP_CAN_EXPLODE_BY_FIRE }, + { ep_can_explode_smashed, EP_CAN_EXPLODE_SMASHED }, + { ep_can_explode_impact, EP_CAN_EXPLODE_IMPACT }, { ep_walkable_over, EP_WALKABLE_OVER }, { ep_walkable_inside, EP_WALKABLE_INSIDE }, { ep_walkable_under, EP_WALKABLE_UNDER }, { ep_passable_over, EP_PASSABLE_OVER }, { ep_passable_inside, EP_PASSABLE_INSIDE }, { ep_passable_under, EP_PASSABLE_UNDER }, + { ep_pushable, EP_PUSHABLE }, - { ep_diggable, EP_DIGGABLE }, - { ep_collectible, EP_COLLECTIBLE }, - { ep_active_bomb, EP_ACTIVE_BOMB }, + { ep_can_be_crumbled, EP_CAN_BE_CRUMBLED }, + + { ep_player, EP_PLAYER }, + { ep_can_pass_magic_wall, EP_CAN_PASS_MAGIC_WALL }, + { ep_switchable, EP_SWITCHABLE }, + { ep_bd_element, EP_BD_ELEMENT }, + { ep_sp_element, EP_SP_ELEMENT }, + { ep_sb_element, EP_SB_ELEMENT }, + { ep_gem, EP_GEM }, + { ep_food_dark_yamyam, EP_FOOD_DARK_YAMYAM }, + { ep_food_penguin, EP_FOOD_PENGUIN }, + { ep_food_pig, EP_FOOD_PIG }, + { ep_historic_wall, EP_HISTORIC_WALL }, + { ep_historic_solid, EP_HISTORIC_SOLID }, + { ep_classic_enemy, EP_CLASSIC_ENEMY }, { ep_belt, EP_BELT }, { ep_belt_active, EP_BELT_ACTIVE }, { ep_belt_switch, EP_BELT_SWITCH }, - { ep_sp_element, EP_SP_ELEMENT }, - { ep_has_content, EP_HAS_CONTENT }, { ep_tube, EP_TUBE }, + { ep_keygate, EP_KEYGATE }, + { ep_amoeboid, EP_AMOEBOID }, + { ep_amoebalive, EP_AMOEBALIVE }, + { ep_has_content, EP_HAS_CONTENT }, + { ep_active_bomb, EP_ACTIVE_BOMB }, + { ep_inactive, EP_INACTIVE }, + { NULL, -1 } }; + static int copy_properties[][5] = + { + { + EL_BUG, + EL_BUG_LEFT, EL_BUG_RIGHT, + EL_BUG_UP, EL_BUG_DOWN + }, + { + EL_SPACESHIP, + EL_SPACESHIP_LEFT, EL_SPACESHIP_RIGHT, + EL_SPACESHIP_UP, EL_SPACESHIP_DOWN + }, + { + EL_BD_BUTTERFLY, + EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY_RIGHT, + EL_BD_BUTTERFLY_UP, EL_BD_BUTTERFLY_DOWN + }, + { + EL_BD_FIREFLY, + EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY_RIGHT, + EL_BD_FIREFLY_UP, EL_BD_FIREFLY_DOWN + }, + { + EL_PACMAN, + EL_PACMAN_LEFT, EL_PACMAN_RIGHT, + EL_PACMAN_UP, EL_PACMAN_DOWN + }, + { + -1, + -1, -1, -1, -1 + } + }; + + int i, j, k; + + /* always start with reliable default values (element has no properties) */ + for (i=0; i < MAX_NUM_ELEMENTS; i++) + for (j=0; j < NUM_ELEMENT_PROPERTIES; j++) + SET_PROPERTY(i, j, FALSE); + + /* set all base element properties from above array definitions */ + for (i=0; element_properties[i].elements != NULL; i++) + for (j=0; (element_properties[i].elements)[j] != -1; j++) + SET_PROPERTY((element_properties[i].elements)[j], + element_properties[i].property, TRUE); + + /* copy properties to some elements that are only stored in level file */ + for (i=0; i < NUM_ELEMENT_PROPERTIES; i++) + for (j=0; copy_properties[j][0] != -1; j++) + if (HAS_PROPERTY(copy_properties[j][0], i)) + for (k=1; k<=4; k++) + SET_PROPERTY(copy_properties[j][k], i, TRUE); +} + +void InitElementPropertiesEngine(int engine_version) +{ #if 0 static int active_properties[] = { EP_AMOEBALIVE, EP_AMOEBOID, EP_PFORTE, - EP_SOLID, - EP_ENEMY, + EP_DONT_COLLIDE_WITH, EP_MAUER, EP_CAN_FALL, EP_CAN_SMASH, - EP_CAN_CHANGE, + EP_CAN_PASS_MAGIC_WALL, EP_CAN_MOVE, - EP_COULD_MOVE, EP_DONT_TOUCH, - EP_DONT_GO_TO, + EP_DONT_RUN_INTO, EP_GEM, - EP_EXPLOSIVE, + EP_CAN_EXPLODE_BY_FIRE, EP_PUSHABLE, EP_PLAYER, EP_HAS_CONTENT, @@ -2315,41 +2450,142 @@ void InitElementProperties() }; #endif - /* always start with reliable default values (no properties) */ - for (i=0; i= EL_CHAR_START && i <= EL_CHAR_END) + SET_PROPERTY(i, EP_INACTIVE, TRUE); + + /* ---------- WALKABLE, PASSABLE, ACCESSIBLE --------------------------- */ + SET_PROPERTY(i, EP_WALKABLE, (IS_WALKABLE_OVER(i) || + IS_WALKABLE_INSIDE(i) || + IS_WALKABLE_UNDER(i))); + + SET_PROPERTY(i, EP_PASSABLE, (IS_PASSABLE_OVER(i) || + IS_PASSABLE_INSIDE(i) || + IS_PASSABLE_UNDER(i))); + + SET_PROPERTY(i, EP_ACCESSIBLE_OVER, (IS_WALKABLE_OVER(i) || + IS_PASSABLE_OVER(i))); + + SET_PROPERTY(i, EP_ACCESSIBLE_INSIDE, (IS_WALKABLE_INSIDE(i) || + IS_PASSABLE_INSIDE(i))); - if (IS_PASSABLE_OVER(i) || IS_PASSABLE_INSIDE(i) || IS_PASSABLE_UNDER(i)) - SET_PROPERTY(i, EP_PASSABLE, TRUE); + SET_PROPERTY(i, EP_ACCESSIBLE_UNDER, (IS_WALKABLE_UNDER(i) || + IS_PASSABLE_UNDER(i))); - if (IS_WALKABLE_OVER(i) || IS_PASSABLE_OVER(i)) - SET_PROPERTY(i, EP_ACCESSIBLE_OVER, TRUE); + SET_PROPERTY(i, EP_ACCESSIBLE, (IS_WALKABLE(i) || + IS_PASSABLE(i))); - if (IS_WALKABLE_INSIDE(i) || IS_PASSABLE_INSIDE(i)) - SET_PROPERTY(i, EP_ACCESSIBLE_INSIDE, TRUE); + /* ---------- SNAPPABLE ------------------------------------------------ */ + SET_PROPERTY(i, EP_SNAPPABLE, (IS_DIGGABLE(i) || + IS_COLLECTIBLE(i) || + IS_SWITCHABLE(i) || + i == EL_BD_ROCK)); - if (IS_WALKABLE_UNDER(i) || IS_PASSABLE_UNDER(i)) - SET_PROPERTY(i, EP_ACCESSIBLE_UNDER, TRUE); + /* ---------- WALL ----------------------------------------------------- */ + SET_PROPERTY(i, EP_WALL, TRUE); /* default: element is wall */ - if (IS_WALKABLE(i) || IS_PASSABLE(i)) - SET_PROPERTY(i, EP_ACCESSIBLE, TRUE); + for (j=0; no_wall_properties[j] != -1; j++) + if (HAS_PROPERTY(i, no_wall_properties[j]) || + i >= EL_FIRST_RUNTIME_UNREAL) + SET_PROPERTY(i, EP_WALL, FALSE); + + if (IS_HISTORIC_WALL(i)) + SET_PROPERTY(i, EP_WALL, TRUE); + + /* ---------- SOLID_FOR_PUSHING ---------------------------------------- */ + if (engine_version < VERSION_IDENT(2,2,0)) + SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, IS_HISTORIC_SOLID(i)); + else + SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, (!IS_WALKABLE(i) && + !IS_DIGGABLE(i) && + !IS_COLLECTIBLE(i))); + + /* ---------- DRAGONFIRE_PROOF ----------------------------------------- */ + + if (IS_HISTORIC_SOLID(i) || i == EL_EXPLOSION) + SET_PROPERTY(i, EP_DRAGONFIRE_PROOF, TRUE); + else + SET_PROPERTY(i, EP_DRAGONFIRE_PROOF, (IS_CUSTOM_ELEMENT(i) && + IS_INDESTRUCTIBLE(i))); + + /* ---------- EXPLOSION_PROOF ------------------------------------------ */ + if (i == EL_FLAMES) + SET_PROPERTY(i, EP_EXPLOSION_PROOF, TRUE); + else if (engine_version < VERSION_IDENT(2,2,0)) + SET_PROPERTY(i, EP_EXPLOSION_PROOF, IS_INDESTRUCTIBLE(i)); + else + SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) && + !IS_WALKABLE_OVER(i) && + !IS_WALKABLE_UNDER(i))); + + if (IS_CUSTOM_ELEMENT(i)) + { + /* ---------- DONT_COLLIDE_WITH / DONT_RUN_INTO ---------------------- */ + if (DONT_TOUCH(i)) + SET_PROPERTY(i, EP_DONT_COLLIDE_WITH, TRUE); + if (DONT_COLLIDE_WITH(i)) + SET_PROPERTY(i, EP_DONT_RUN_INTO, TRUE); + + /* ---------- CAN_SMASH_ENEMIES / CAN_SMASH_PLAYER ------------------- */ + if (CAN_SMASH_EVERYTHING(i)) + SET_PROPERTY(i, EP_CAN_SMASH_ENEMIES, TRUE); + if (CAN_SMASH_ENEMIES(i)) + SET_PROPERTY(i, EP_CAN_SMASH_PLAYER, TRUE); + } + + /* ---------- CAN_SMASH ------------------------------------------------ */ + SET_PROPERTY(i, EP_CAN_SMASH, (CAN_SMASH_PLAYER(i) || + CAN_SMASH_ENEMIES(i) || + CAN_SMASH_EVERYTHING(i))); + + /* ---------- CAN_EXPLODE ---------------------------------------------- */ + SET_PROPERTY(i, EP_CAN_EXPLODE, (CAN_EXPLODE_BY_FIRE(i) || + CAN_EXPLODE_SMASHED(i) || + CAN_EXPLODE_BY_FIRE(i))); } #if 0 @@ -2371,26 +2607,43 @@ void InitElementProperties() } #endif -#if 0 - for (i=0; i < MAX_NUM_ELEMENTS; i++) + /* dynamically adjust element properties according to game engine version */ { - boolean element_is_solid = TRUE; - - if (IS_DIGGABLE(i) || - IS_COLLECTIBLE(i) || - CAN_FALL(i) || - CAN_MOVE(i) || - IS_PUSHABLE(i)) - element_is_solid = FALSE; + static int ep_em_slippery_wall[] = + { + EL_STEELWALL, + EL_WALL, + EL_EXPANDABLE_WALL, + EL_EXPANDABLE_WALL_HORIZONTAL, + EL_EXPANDABLE_WALL_VERTICAL, + EL_EXPANDABLE_WALL_ANY, + -1 + }; + + /* special EM style gems behaviour */ + for (i=0; ep_em_slippery_wall[i] != -1; i++) + SET_PROPERTY(ep_em_slippery_wall[i], EP_EM_SLIPPERY_WALL, + level.em_slippery_gems); + + /* "EL_EXPANDABLE_WALL_GROWING" wasn't slippery for EM gems in 2.0.1 */ + SET_PROPERTY(EL_EXPANDABLE_WALL_GROWING, EP_EM_SLIPPERY_WALL, + (level.em_slippery_gems && + engine_version > VERSION_IDENT(2,0,1))); + } - if (IS_INDESTRUCTIBLE(i)) - element_is_solid = TRUE; + /* dynamically adjust element properties according to game engine version */ +#if 0 + if (engine_version < RELEASE_IDENT(2,2,0,7)) +#endif + { + for (i=0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; - if (element_is_solid != HAS_PROPERTY(i, EP_SOLID)) - printf("::: '%s' should %s solid\n", element_info[i].token_name, - (HAS_PROPERTY(i, EP_SOLID) ? "NOT be" : "be")); + element_info[element].push_delay_fixed = 2; + element_info[element].push_delay_random = 8; + } } -#endif } static void InitGlobal() @@ -2542,27 +2795,43 @@ static void InitArtworkConfig() static char *direction_id_suffix[NUM_DIRECTIONS + 1]; static char *special_id_suffix[NUM_SPECIAL_GFX_ARGS + 1]; static char *dummy[1] = { NULL }; - static char *ignore_image_tokens[] = - { - "name", - "sort_priority", - "global.num_toons", - "menu.draw_xoffset", - "menu.draw_yoffset", - "menu.draw_xoffset.MAIN", - "menu.draw_yoffset.MAIN", - "door.step_offset", - "door.step_delay", - NULL - }; - static char *ignore_sound_tokens[] = + static char *ignore_generic_tokens[] = { "name", "sort_priority", NULL }; + static char **ignore_image_tokens, **ignore_sound_tokens; + int num_ignore_generic_tokens; + int num_ignore_image_tokens, num_ignore_sound_tokens; int i; + /* dynamically determine list of generic tokens to be ignored */ + num_ignore_generic_tokens = 0; + for (i=0; ignore_generic_tokens[i] != NULL; i++) + num_ignore_generic_tokens++; + + /* dynamically determine list of image tokens to be ignored */ + num_ignore_image_tokens = num_ignore_generic_tokens; + for (i=0; image_config_vars[i].token != NULL; i++) + num_ignore_image_tokens++; + ignore_image_tokens = + checked_malloc((num_ignore_image_tokens + 1) * sizeof(char *)); + for (i=0; i < num_ignore_generic_tokens; i++) + ignore_image_tokens[i] = ignore_generic_tokens[i]; + for (i=0; i < num_ignore_image_tokens - num_ignore_generic_tokens; i++) + ignore_image_tokens[num_ignore_generic_tokens + i] = + image_config_vars[i].token; + ignore_image_tokens[num_ignore_image_tokens] = NULL; + + /* dynamically determine list of sound tokens to be ignored */ + num_ignore_sound_tokens = num_ignore_generic_tokens; + ignore_sound_tokens = + checked_malloc((num_ignore_sound_tokens + 1) * sizeof(char *)); + for (i=0; i < num_ignore_generic_tokens; i++) + ignore_sound_tokens[i] = ignore_generic_tokens[i]; + ignore_sound_tokens[num_ignore_sound_tokens] = NULL; + for (i=0; i