X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=5015dc9842b06818fff102f28031c05a90556f79;hb=f857fec3082c785b0dd271b6ad1b7642a2ed4e65;hp=e766a52de4a9b4311401fc355bbcd9298ea03f98;hpb=6ed4958820f8f97174ca47594dcc6f00ee31b2cb;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index e766a52d..5015dc98 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) @@ -363,7 +353,7 @@ void InitFontGraphicInfo() /* ---------- initialize font bitmap array ---------- */ if (font_bitmap_info != NULL) - free(font_bitmap_info); + FreeFontInfo(font_bitmap_info); font_bitmap_info = checked_calloc(num_font_bitmaps * sizeof(struct FontBitmapInfo)); @@ -383,6 +373,13 @@ void InitFontGraphicInfo() int font_bitmap_id = font_info[i].special_bitmap_id[j]; int graphic = font_info[i].special_graphic[j]; + /* set 'graphic_info' for font entries, if uninitialized (guessed) */ + if (graphic_info[graphic].anim_frames < MIN_NUM_CHARS_PER_FONT) + { + graphic_info[graphic].anim_frames = DEFAULT_NUM_CHARS_PER_FONT; + graphic_info[graphic].anim_frames_per_line= DEFAULT_NUM_CHARS_PER_LINE; + } + /* copy font relevant information from graphics information */ font_bitmap_info[font_bitmap_id].bitmap = graphic_info[graphic].bitmap; font_bitmap_info[font_bitmap_id].src_x = graphic_info[graphic].src_x; @@ -391,6 +388,11 @@ void InitFontGraphicInfo() font_bitmap_info[font_bitmap_id].height = graphic_info[graphic].height; font_bitmap_info[font_bitmap_id].draw_x = graphic_info[graphic].draw_x; font_bitmap_info[font_bitmap_id].draw_y = graphic_info[graphic].draw_y; + + font_bitmap_info[font_bitmap_id].num_chars = + graphic_info[graphic].anim_frames; + font_bitmap_info[font_bitmap_id].num_chars_per_line = + graphic_info[graphic].anim_frames_per_line; } } @@ -479,9 +481,9 @@ void InitElementGraphicInfo() for (act=0; actwidth : TILEX) / TILEX; - int num_ytiles = (src_bitmap ? src_bitmap->height * 2 / 3 : TILEY) / TILEY; int parameter[NUM_GFX_ARGS]; + int anim_frames_per_row = 1, anim_frames_per_col = 1; + int anim_frames_per_line = 1; int i; /* get integer values from string parameters */ @@ -602,20 +604,26 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE) graphic_info[graphic].height = parameter[GFX_ARG_HEIGHT]; + if (src_bitmap) + { + anim_frames_per_row = src_bitmap->width / graphic_info[graphic].width; + anim_frames_per_col = src_bitmap->height / graphic_info[graphic].height; + } + /* correct x or y offset dependant of vertical or horizontal frame order */ if (parameter[GFX_ARG_VERTICAL]) /* frames are ordered vertically */ { - if (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE) - graphic_info[graphic].offset_y = parameter[GFX_ARG_OFFSET]; - else - graphic_info[graphic].offset_y = graphic_info[graphic].height; + graphic_info[graphic].offset_y = + (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE ? + parameter[GFX_ARG_OFFSET] : graphic_info[graphic].height); + anim_frames_per_line = anim_frames_per_col; } else /* frames are ordered horizontally */ { - if (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE) - graphic_info[graphic].offset_x = parameter[GFX_ARG_OFFSET]; - else - graphic_info[graphic].offset_x = graphic_info[graphic].width; + graphic_info[graphic].offset_x = + (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE ? + parameter[GFX_ARG_OFFSET] : graphic_info[graphic].width); + anim_frames_per_line = anim_frames_per_row; } /* optionally, the x and y offset of frames can be specified directly */ @@ -628,20 +636,23 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) if (parameter[GFX_ARG_FRAMES] != ARG_UNDEFINED_VALUE) graphic_info[graphic].anim_frames = parameter[GFX_ARG_FRAMES]; else if (parameter[GFX_ARG_XPOS] == 0 && !parameter[GFX_ARG_VERTICAL]) - graphic_info[graphic].anim_frames = num_xtiles; + graphic_info[graphic].anim_frames = anim_frames_per_row; else if (parameter[GFX_ARG_YPOS] == 0 && parameter[GFX_ARG_VERTICAL]) - graphic_info[graphic].anim_frames = num_ytiles; + graphic_info[graphic].anim_frames = anim_frames_per_col; else graphic_info[graphic].anim_frames = 1; + graphic_info[graphic].anim_frames_per_line = + (parameter[GFX_ARG_FRAMES_PER_LINE] != ARG_UNDEFINED_VALUE ? + parameter[GFX_ARG_FRAMES_PER_LINE] : anim_frames_per_line); + graphic_info[graphic].anim_delay = parameter[GFX_ARG_DELAY]; if (graphic_info[graphic].anim_delay == 0) /* delay must be at least 1 */ graphic_info[graphic].anim_delay = 1; - if (parameter[GFX_ARG_ANIM_MODE] != ANIM_NONE) - graphic_info[graphic].anim_mode = parameter[GFX_ARG_ANIM_MODE]; - else if (graphic_info[graphic].anim_frames > 1) - graphic_info[graphic].anim_mode = ANIM_LOOP; + graphic_info[graphic].anim_mode = parameter[GFX_ARG_ANIM_MODE]; + if (graphic_info[graphic].anim_frames == 1) + graphic_info[graphic].anim_mode = ANIM_NONE; /* automatically determine correct start frame, if not defined */ if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE) @@ -1057,31 +1068,33 @@ static void ReinitializeMusic() /* currently nothing to do */ } -void InitElementProperties() +void InitElementPropertiesStatic() { - int i, j; - - static int ep_amoebalive[] = - { - EL_AMOEBA_WET, - EL_AMOEBA_DRY, - EL_AMOEBA_FULL, - EL_BD_AMOEBA - }; - static int ep_amoebalive_num = SIZEOF_ARRAY_INT(ep_amoebalive); - - static int ep_amoeboid[] = + static int ep_diggable[] = { - EL_AMOEBA_DEAD, - 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, +#if 1 + EL_LANDMINE, + EL_TRAP_ACTIVE, + EL_SP_BUGGY_BASE_ACTIVE, +#endif + -1 }; - static int ep_amoeboid_num = SIZEOF_ARRAY_INT(ep_amoeboid); - static int ep_schluessel[] = + static int ep_collectible[] = { + 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, @@ -1089,204 +1102,23 @@ void InitElementProperties() EL_EM_KEY_1, EL_EM_KEY_2, EL_EM_KEY_3, - EL_EM_KEY_4 - }; - static int ep_schluessel_num = SIZEOF_ARRAY_INT(ep_schluessel); - - static int ep_pforte[] = - { - 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, - 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 - }; - static int ep_pforte_num = SIZEOF_ARRAY_INT(ep_pforte); - - static int ep_solid[] = - { - 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, - - /* 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_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_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, - 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 + EL_KEY_WHITE, + EL_SHIELD_NORMAL, + EL_SHIELD_DEADLY, + EL_EXTRA_TIME, + EL_ENVELOPE, + EL_SPEED_PILL, + -1 }; - static int ep_solid_num = SIZEOF_ARRAY_INT(ep_solid); static int ep_indestructible[] = { @@ -1376,9 +1208,9 @@ void InitElementProperties() EL_TUBE_LEFT_UP, EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, - EL_TUBE_RIGHT_DOWN + EL_TUBE_RIGHT_DOWN, + -1 }; - static int ep_indestructible_num = SIZEOF_ARRAY_INT(ep_indestructible); static int ep_slippery[] = { @@ -1413,96 +1245,11 @@ void InitElementProperties() EL_SPEED_PILL, EL_STEELWALL_SLANTED, EL_PEARL, - EL_CRYSTAL - }; - static int ep_slippery_num = SIZEOF_ARRAY_INT(ep_slippery); - - static int ep_enemy[] = - { - EL_BUG, - EL_SPACESHIP, - EL_BD_BUTTERFLY, - EL_BD_FIREFLY, - EL_YAMYAM, - EL_DARK_YAMYAM, - EL_ROBOT, - EL_PACMAN, - EL_SP_SNIKSNAK, - EL_SP_ELECTRON + EL_CRYSTAL, + -1 }; - static int ep_enemy_num = SIZEOF_ARRAY_INT(ep_enemy); - static int ep_mauer[] = - { - 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 - }; - static int ep_mauer_num = SIZEOF_ARRAY_INT(ep_mauer); - - static int ep_can_fall[] = + static int ep_can_fall[] = { EL_ROCK, EL_BD_ROCK, @@ -1526,9 +1273,9 @@ void InitElementProperties() EL_PEARL, EL_CRYSTAL, EL_SPRING, - EL_DX_SUPABOMB + EL_DX_SUPABOMB, + -1 }; - static int ep_can_fall_num = SIZEOF_ARRAY_INT(ep_can_fall); static int ep_can_smash[] = { @@ -1551,47 +1298,125 @@ void InitElementProperties() EL_PEARL, EL_CRYSTAL, EL_SPRING, - EL_DX_SUPABOMB + EL_DX_SUPABOMB, + -1 }; - static int ep_can_smash_num = SIZEOF_ARRAY_INT(ep_can_smash); - static int ep_can_change[] = + static int ep_walkable_over[] = { - EL_ROCK, - EL_BD_ROCK, - EL_EMERALD, - EL_BD_DIAMOND, - EL_EMERALD_YELLOW, - EL_EMERALD_RED, - EL_EMERALD_PURPLE, - EL_DIAMOND + 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_can_change_num = SIZEOF_ARRAY_INT(ep_can_change); - static int ep_can_move[] = + static int ep_walkable_inside[] = { - EL_BUG, - EL_SPACESHIP, - EL_BD_BUTTERFLY, - EL_BD_FIREFLY, - EL_YAMYAM, - EL_DARK_YAMYAM, - EL_ROBOT, - EL_PACMAN, - EL_MOLE, - EL_PENGUIN, - EL_PIG, - EL_DRAGON, + 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_walkable_under[] = + { + -1 + }; + + static int ep_passable_over[] = + { + 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_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_pushable[] = + { + EL_ROCK, + EL_BD_ROCK, + EL_BOMB, + EL_NUT, + EL_TIME_ORB_EMPTY, + EL_SOKOBAN_FIELD_FULL, + EL_SOKOBAN_OBJECT, EL_SATELLITE, - EL_SP_SNIKSNAK, - EL_SP_ELECTRON, + EL_SP_ZONK, + EL_SP_DISK_ORANGE, + EL_SP_DISK_YELLOW, EL_BALLOON, - EL_SPRING + EL_SPRING, + EL_DX_SUPABOMB, + -1 + }; + + static int ep_player[] = + { + EL_PLAYER_1, + EL_PLAYER_2, + EL_PLAYER_3, + EL_PLAYER_4, + -1 + }; + + static int ep_can_be_crumbled[] = + { + EL_SAND, + EL_LANDMINE, + EL_TRAP, + EL_TRAP_ACTIVE, + -1 }; - static int ep_can_move_num = SIZEOF_ARRAY_INT(ep_can_move); - static int ep_could_move[] = + static int ep_can_move[] = { + /* only stored in level file */ EL_BUG_RIGHT, EL_BUG_UP, EL_BUG_LEFT, @@ -1611,20 +1436,52 @@ void InitElementProperties() EL_PACMAN_RIGHT, EL_PACMAN_UP, EL_PACMAN_LEFT, - EL_PACMAN_DOWN + EL_PACMAN_DOWN, + + /* level file and runtime elements */ + EL_BUG, + EL_SPACESHIP, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, + EL_YAMYAM, + EL_DARK_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_MOLE, + EL_PENGUIN, + EL_PIG, + EL_DRAGON, + EL_SATELLITE, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON, + EL_BALLOON, + EL_SPRING, + -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_could_move_num = SIZEOF_ARRAY_INT(ep_could_move); static int ep_dont_touch[] = { EL_BUG, EL_SPACESHIP, EL_BD_BUTTERFLY, - EL_BD_FIREFLY + EL_BD_FIREFLY, + -1 }; - static int ep_dont_touch_num = SIZEOF_ARRAY_INT(ep_dont_touch); - static int ep_dont_go_to[] = + static int ep_enemy[] = { EL_BUG, EL_SPACESHIP, @@ -1634,42 +1491,58 @@ void InitElementProperties() 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 + -1 }; - static int ep_dont_go_to_num = SIZEOF_ARRAY_INT(ep_dont_go_to); - static int ep_mampf2[] = + static int ep_dont_go_to[] = { - EL_SAND, EL_BUG, EL_SPACESHIP, EL_BD_BUTTERFLY, EL_BD_FIREFLY, EL_YAMYAM, + EL_DARK_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_ACID, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON, + EL_SP_BUGGY_BASE_ACTIVE, + EL_TRAP_ACTIVE, + EL_LANDMINE, + -1 + }; + + static int ep_can_explode[] = + { + 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_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, + -1 }; - static int ep_mampf2_num = SIZEOF_ARRAY_INT(ep_mampf2); static int ep_bd_element[] = { @@ -1696,11 +1569,61 @@ void InitElementProperties() EL_BD_BUTTERFLY_3, EL_BD_BUTTERFLY_4, EL_BD_AMOEBA, - EL_CHAR_QUESTION + EL_CHAR_QUESTION, + -1 }; - static int ep_bd_element_num = SIZEOF_ARRAY_INT(ep_bd_element); - static int ep_sb_element[] = + 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, + EL_SP_PORT_UP, + EL_SP_GRAVITY_PORT_RIGHT, + 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_ANY, + EL_SP_ELECTRON, + EL_SP_BUGGY_BASE, + EL_SP_CHIP_LEFT, + EL_SP_CHIP_RIGHT, + 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_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_sb_element[] = { EL_EMPTY, EL_STEELWALL, @@ -1708,41 +1631,75 @@ void InitElementProperties() EL_SOKOBAN_FIELD_EMPTY, EL_SOKOBAN_FIELD_FULL, EL_PLAYER_1, - EL_INVISIBLE_STEELWALL + EL_INVISIBLE_STEELWALL, + -1 }; - static int ep_sb_element_num = SIZEOF_ARRAY_INT(ep_sb_element); static int ep_gem[] = { - EL_EMERALD, EL_BD_DIAMOND, + EL_EMERALD, EL_EMERALD_YELLOW, EL_EMERALD_RED, EL_EMERALD_PURPLE, - EL_DIAMOND + EL_DIAMOND, + -1 }; - static int ep_gem_num = SIZEOF_ARRAY_INT(ep_gem); - static int ep_inactive[] = + static int ep_food_dark_yamyam[] = { - EL_EMPTY, EL_SAND, - EL_WALL, - EL_BD_WALL, - EL_WALL_CRUMBLED, - EL_STEELWALL, + EL_BUG, + EL_SPACESHIP, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, + EL_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_AMOEBA_DROP, 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_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 + }; + + static int ep_food_penguin[] = + { + EL_EMERALD, + EL_BD_DIAMOND, + EL_EMERALD_YELLOW, + EL_EMERALD_RED, + EL_EMERALD_PURPLE, + EL_DIAMOND, + EL_PEARL, + EL_CRYSTAL, + -1 + }; + + static int ep_food_pig[] = + { + EL_EMERALD, + EL_BD_DIAMOND, + EL_EMERALD_YELLOW, + EL_EMERALD_RED, + EL_EMERALD_PURPLE, + EL_DIAMOND, + -1 + }; + + static int ep_historic_wall[] = + { + EL_STEELWALL, EL_GATE_1, EL_GATE_2, EL_GATE_3, @@ -1759,55 +1716,129 @@ void InitElementProperties() EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, - EL_DYNAMITE, + 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_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_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_historic_solid[] = + { + 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_AMOEBA_TO_DIAMOND, - EL_BLOCKED, - EL_SP_EMPTY, - EL_SP_BASE, - EL_SP_PORT_RIGHT, - EL_SP_PORT_DOWN, - EL_SP_PORT_LEFT, - EL_SP_PORT_UP, - EL_SP_GRAVITY_PORT_RIGHT, - EL_SP_GRAVITY_PORT_DOWN, - EL_SP_GRAVITY_PORT_LEFT, - EL_SP_GRAVITY_PORT_UP, - EL_SP_PORT_HORIZONTAL, - EL_SP_PORT_VERTICAL, - EL_SP_PORT_ANY, - EL_SP_DISK_RED, - EL_SP_DISK_YELLOW, + 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, + + /* 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, @@ -1819,6 +1850,8 @@ void InitElementProperties() 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, @@ -1831,6 +1864,8 @@ void InitElementProperties() 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, @@ -1848,85 +1883,151 @@ void InitElementProperties() 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_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, + 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_inactive_num = SIZEOF_ARRAY_INT(ep_inactive); - static int ep_explosive[] = + static int ep_belt[] = { - 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_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_CONVEYOR_BELT_1_LEFT, + EL_CONVEYOR_BELT_1_MIDDLE, + EL_CONVEYOR_BELT_1_RIGHT, + EL_CONVEYOR_BELT_2_LEFT, + EL_CONVEYOR_BELT_2_MIDDLE, + EL_CONVEYOR_BELT_2_RIGHT, + EL_CONVEYOR_BELT_3_LEFT, + EL_CONVEYOR_BELT_3_MIDDLE, + EL_CONVEYOR_BELT_3_RIGHT, + EL_CONVEYOR_BELT_4_LEFT, + EL_CONVEYOR_BELT_4_MIDDLE, + EL_CONVEYOR_BELT_4_RIGHT, + -1 }; - static int ep_explosive_num = SIZEOF_ARRAY_INT(ep_explosive); - static int ep_mampf3[] = + static int ep_belt_active[] = { - EL_EMERALD, - EL_BD_DIAMOND, - EL_EMERALD_YELLOW, - EL_EMERALD_RED, - EL_EMERALD_PURPLE, - EL_DIAMOND, - EL_PEARL, - EL_CRYSTAL + EL_CONVEYOR_BELT_1_LEFT_ACTIVE, + EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE, + EL_CONVEYOR_BELT_1_RIGHT_ACTIVE, + EL_CONVEYOR_BELT_2_LEFT_ACTIVE, + EL_CONVEYOR_BELT_2_MIDDLE_ACTIVE, + EL_CONVEYOR_BELT_2_RIGHT_ACTIVE, + EL_CONVEYOR_BELT_3_LEFT_ACTIVE, + EL_CONVEYOR_BELT_3_MIDDLE_ACTIVE, + EL_CONVEYOR_BELT_3_RIGHT_ACTIVE, + EL_CONVEYOR_BELT_4_LEFT_ACTIVE, + EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE, + EL_CONVEYOR_BELT_4_RIGHT_ACTIVE, + -1 }; - static int ep_mampf3_num = SIZEOF_ARRAY_INT(ep_mampf3); - static int ep_pushable[] = + static int ep_belt_switch[] = { - 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_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, + -1 }; - static int ep_pushable_num = SIZEOF_ARRAY_INT(ep_pushable); - static int ep_player[] = + static int ep_tube[] = { - EL_PLAYER_1, - EL_PLAYER_2, - EL_PLAYER_3, - EL_PLAYER_4 + 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_player_num = SIZEOF_ARRAY_INT(ep_player); static int ep_has_content[] = { @@ -1934,34 +2035,88 @@ void InitElementProperties() EL_AMOEBA_WET, EL_AMOEBA_DRY, EL_AMOEBA_FULL, - EL_BD_AMOEBA + EL_BD_AMOEBA, + -1 }; - static int ep_has_content_num = SIZEOF_ARRAY_INT(ep_has_content); - static int ep_eatable[] = + static int ep_active_bomb[] = { - EL_SAND, - EL_SP_BASE, - EL_SP_BUGGY_BASE, - EL_SP_BUGGY_BASE_ACTIVATING, - EL_TRAP, - EL_INVISIBLE_SAND, - EL_INVISIBLE_SAND_ACTIVE + 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_eatable_num = SIZEOF_ARRAY_INT(ep_eatable); - static int ep_sp_element[] = + 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, @@ -1970,136 +2125,27 @@ 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 - }; - static int ep_sp_element_num = SIZEOF_ARRAY_INT(ep_sp_element); - - static int ep_quick_gate[] = - { - 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_SP_PORT_LEFT, - EL_SP_PORT_RIGHT, - EL_SP_PORT_UP, - EL_SP_PORT_DOWN, - EL_SP_GRAVITY_PORT_LEFT, - EL_SP_GRAVITY_PORT_RIGHT, - EL_SP_GRAVITY_PORT_UP, - EL_SP_GRAVITY_PORT_DOWN, - EL_SP_PORT_HORIZONTAL, - EL_SP_PORT_VERTICAL, - EL_SP_PORT_ANY, - EL_SWITCHGATE_OPEN, - EL_TIMEGATE_OPEN - }; - static int ep_quick_gate_num = SIZEOF_ARRAY_INT(ep_quick_gate); - - static int ep_over_player[] = - { - EL_SP_PORT_LEFT, - EL_SP_PORT_RIGHT, - EL_SP_PORT_UP, - EL_SP_PORT_DOWN, - EL_SP_GRAVITY_PORT_LEFT, - EL_SP_GRAVITY_PORT_RIGHT, - EL_SP_GRAVITY_PORT_UP, - EL_SP_GRAVITY_PORT_DOWN, - EL_SP_PORT_HORIZONTAL, - EL_SP_PORT_VERTICAL, - EL_SP_PORT_ANY, - 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 - }; - static int ep_over_player_num = SIZEOF_ARRAY_INT(ep_over_player); - - 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 - }; - static int ep_active_bomb_num = SIZEOF_ARRAY_INT(ep_active_bomb); - - static int ep_belt[] = - { - EL_CONVEYOR_BELT_1_LEFT, - EL_CONVEYOR_BELT_1_MIDDLE, - EL_CONVEYOR_BELT_1_RIGHT, - EL_CONVEYOR_BELT_2_LEFT, - EL_CONVEYOR_BELT_2_MIDDLE, - EL_CONVEYOR_BELT_2_RIGHT, - EL_CONVEYOR_BELT_3_LEFT, - EL_CONVEYOR_BELT_3_MIDDLE, - EL_CONVEYOR_BELT_3_RIGHT, - EL_CONVEYOR_BELT_4_LEFT, - EL_CONVEYOR_BELT_4_MIDDLE, - EL_CONVEYOR_BELT_4_RIGHT, - }; - static int ep_belt_num = SIZEOF_ARRAY_INT(ep_belt); - - static int ep_belt_active[] = - { - EL_CONVEYOR_BELT_1_LEFT_ACTIVE, - EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE, - EL_CONVEYOR_BELT_1_RIGHT_ACTIVE, - EL_CONVEYOR_BELT_2_LEFT_ACTIVE, - EL_CONVEYOR_BELT_2_MIDDLE_ACTIVE, - EL_CONVEYOR_BELT_2_RIGHT_ACTIVE, - EL_CONVEYOR_BELT_3_LEFT_ACTIVE, - EL_CONVEYOR_BELT_3_MIDDLE_ACTIVE, - EL_CONVEYOR_BELT_3_RIGHT_ACTIVE, - EL_CONVEYOR_BELT_4_LEFT_ACTIVE, - EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE, - EL_CONVEYOR_BELT_4_RIGHT_ACTIVE, - }; - static int ep_belt_active_num = SIZEOF_ARRAY_INT(ep_belt_active); - - static int ep_belt_switch[] = - { EL_CONVEYOR_BELT_1_SWITCH_LEFT, EL_CONVEYOR_BELT_1_SWITCH_MIDDLE, EL_CONVEYOR_BELT_1_SWITCH_RIGHT, @@ -2112,186 +2158,278 @@ void InitElementProperties() 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 }; - static int ep_belt_switch_num = SIZEOF_ARRAY_INT(ep_belt_switch); - static int ep_tube[] = + static struct { - 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 + int *elements; + int property; + } element_properties[] = + { + { ep_diggable, EP_DIGGABLE }, + { ep_collectible, EP_COLLECTIBLE }, + { ep_indestructible, EP_INDESTRUCTIBLE }, + { ep_slippery, EP_SLIPPERY }, + { ep_can_fall, EP_CAN_FALL }, + { ep_can_smash, EP_CAN_SMASH }, + { 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_player, EP_PLAYER }, + { ep_can_be_crumbled, EP_CAN_BE_CRUMBLED }, + { ep_can_move, EP_CAN_MOVE }, + { ep_can_pass_magic_wall, EP_CAN_PASS_MAGIC_WALL }, + { ep_dont_touch, EP_DONT_TOUCH }, + { ep_enemy, EP_ENEMY }, + { ep_dont_go_to, EP_DONT_GO_TO }, + { ep_can_explode, EP_CAN_EXPLODE }, + { 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_belt, EP_BELT }, + { ep_belt_active, EP_BELT_ACTIVE }, + { ep_belt_switch, EP_BELT_SWITCH }, + { 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 ep_tube_num = SIZEOF_ARRAY_INT(ep_tube); - static int ep_em_slippery_wall[] = - { - }; - static int ep_em_slippery_wall_num = SIZEOF_ARRAY_INT(ep_em_slippery_wall); + int i, j; - static int ep_can_be_crumbled[] = - { - EL_SAND, - EL_LANDMINE, - EL_TRAP, - EL_TRAP_ACTIVE - }; - static int ep_can_be_crumbled_num = SIZEOF_ARRAY_INT(ep_can_be_crumbled); - - static long ep1_bit[] = - { - EP_BIT_AMOEBALIVE, - EP_BIT_AMOEBOID, - EP_BIT_SCHLUESSEL, - EP_BIT_PFORTE, - EP_BIT_SOLID, - EP_BIT_INDESTRUCTIBLE, - EP_BIT_SLIPPERY, - EP_BIT_ENEMY, - EP_BIT_MAUER, - EP_BIT_CAN_FALL, - EP_BIT_CAN_SMASH, - EP_BIT_CAN_CHANGE, - EP_BIT_CAN_MOVE, - EP_BIT_COULD_MOVE, - EP_BIT_DONT_TOUCH, - EP_BIT_DONT_GO_TO, - EP_BIT_MAMPF2, - EP_BIT_BD_ELEMENT, - EP_BIT_SB_ELEMENT, - EP_BIT_GEM, - EP_BIT_INACTIVE, - EP_BIT_EXPLOSIVE, - EP_BIT_MAMPF3, - EP_BIT_PUSHABLE, - EP_BIT_PLAYER, - EP_BIT_HAS_CONTENT, - EP_BIT_EATABLE, - EP_BIT_SP_ELEMENT, - EP_BIT_QUICK_GATE, - EP_BIT_OVER_PLAYER, - EP_BIT_ACTIVE_BOMB - }; - static long ep2_bit[] = - { - EP_BIT_BELT, - EP_BIT_BELT_ACTIVE, - EP_BIT_BELT_SWITCH, - EP_BIT_TUBE, - EP_BIT_EM_SLIPPERY_WALL, - EP_BIT_CAN_BE_CRUMBLED - }; - static int *ep1_array[] = - { - ep_amoebalive, - ep_amoeboid, - ep_schluessel, - ep_pforte, - ep_solid, - ep_indestructible, - ep_slippery, - ep_enemy, - ep_mauer, - ep_can_fall, - ep_can_smash, - ep_can_change, - ep_can_move, - ep_could_move, - ep_dont_touch, - ep_dont_go_to, - ep_mampf2, - ep_bd_element, - ep_sb_element, - ep_gem, - ep_inactive, - ep_explosive, - ep_mampf3, - ep_pushable, - ep_player, - ep_has_content, - ep_eatable, - ep_sp_element, - ep_quick_gate, - ep_over_player, - ep_active_bomb - }; - static int *ep2_array[] = - { - ep_belt, - ep_belt_active, - ep_belt_switch, - ep_tube, - ep_em_slippery_wall, - ep_can_be_crumbled - }; - static int *ep1_num[] = - { - &ep_amoebalive_num, - &ep_amoeboid_num, - &ep_schluessel_num, - &ep_pforte_num, - &ep_solid_num, - &ep_indestructible_num, - &ep_slippery_num, - &ep_enemy_num, - &ep_mauer_num, - &ep_can_fall_num, - &ep_can_smash_num, - &ep_can_change_num, - &ep_can_move_num, - &ep_could_move_num, - &ep_dont_touch_num, - &ep_dont_go_to_num, - &ep_mampf2_num, - &ep_bd_element_num, - &ep_sb_element_num, - &ep_gem_num, - &ep_inactive_num, - &ep_explosive_num, - &ep_mampf3_num, - &ep_pushable_num, - &ep_player_num, - &ep_has_content_num, - &ep_eatable_num, - &ep_sp_element_num, - &ep_quick_gate_num, - &ep_over_player_num, - &ep_active_bomb_num + /* 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); +} + +void InitElementPropertiesEngine(int engine_version) +{ +#if 0 + static int active_properties[] = + { + EP_AMOEBALIVE, + EP_AMOEBOID, + EP_PFORTE, + EP_ENEMY, + EP_MAUER, + EP_CAN_FALL, + EP_CAN_SMASH, + EP_CAN_PASS_MAGIC_WALL, + EP_CAN_MOVE, + EP_DONT_TOUCH, + EP_DONT_GO_TO, + EP_GEM, + EP_CAN_EXPLODE, + EP_PUSHABLE, + EP_PLAYER, + EP_HAS_CONTENT, + EP_DIGGABLE, + EP_PASSABLE_INSIDE, + EP_OVER_PLAYER, + EP_ACTIVE_BOMB, + + EP_BELT, + EP_BELT_ACTIVE, + EP_BELT_SWITCH, + EP_WALKABLE_UNDER, + EP_EM_SLIPPERY_WALL, + EP_CAN_BE_CRUMBLED, }; - static int *ep2_num[] = - { - &ep_belt_num, - &ep_belt_active_num, - &ep_belt_switch_num, - &ep_tube_num, - &ep_em_slippery_wall_num, - &ep_can_be_crumbled_num +#endif + + static int no_wall_properties[] = + { + EP_AMOEBALIVE, + EP_AMOEBOID, + EP_CAN_BE_CRUMBLED, + EP_ENEMY, + EP_CAN_FALL, + EP_CAN_SMASH, + EP_CAN_MOVE, + EP_DONT_GO_TO, + EP_FOOD_DARK_YAMYAM, + EP_GEM, + EP_FOOD_PENGUIN, + EP_PUSHABLE, + EP_PLAYER, + EP_ACCESSIBLE, + EP_DIGGABLE, + EP_COLLECTIBLE, + EP_ACTIVE_BOMB, + EP_BELT, + EP_BELT_ACTIVE, + EP_TUBE, + -1 }; - static int num_properties1 = SIZEOF_ARRAY(ep1_num, int *); - static int num_properties2 = SIZEOF_ARRAY(ep2_num, int *); - 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))); + + SET_PROPERTY(i, EP_ACCESSIBLE_UNDER, (IS_WALKABLE_UNDER(i) || + IS_PASSABLE_UNDER(i))); + + SET_PROPERTY(i, EP_ACCESSIBLE, (IS_WALKABLE(i) || + IS_PASSABLE(i))); + + /* ---------- WALL ----------------------------------------------------- */ + SET_PROPERTY(i, EP_WALL, TRUE); /* default: element is wall */ + + 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))); } - for (i=0; i VERSION_IDENT(2,0,1))); + } } static void InitGlobal() @@ -2443,27 +2581,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