X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=d228ea5064a6340cfb7183da8b60f57b73bb681d;hb=c46bcfd8dd92fbf3ce134eed1e64078147d33b50;hp=6b00cb9077bd8a7b1119e36c58d3e2882bb0c381;hpb=63f41483ea7866802a7f6382c1d1b7135a1cd86a;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 6b00cb90..d228ea50 100644 --- a/src/init.c +++ b/src/init.c @@ -320,7 +320,7 @@ void InitElementGraphicInfo() element_info[i].graphic[act] = -1; element_info[i].crumbled[act] = -1; - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) { element_info[i].direction_graphic[act][dir] = -1; element_info[i].direction_crumbled[act][dir] = -1; @@ -404,7 +404,7 @@ void InitElementGraphicInfo() if (crumbled) { if (direction < 0) - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) element_info[element].direction_crumbled[action][dir] = -1; if (direction > -1) @@ -415,7 +415,7 @@ void InitElementGraphicInfo() else { if (direction < 0) - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) element_info[element].direction_graphic[action][dir] = -1; if (direction > -1) @@ -443,7 +443,7 @@ void InitElementGraphicInfo() element_info[i].crumbled[act] = element_info[crumbled_like].crumbled[act]; for (act = 0; act < NUM_ACTIONS; act++) - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) element_info[i].direction_crumbled[act][dir] = element_info[crumbled_like].direction_crumbled[act][dir]; } @@ -452,7 +452,7 @@ void InitElementGraphicInfo() { element_info[i].graphic[ACTION_DIGGING] = element_info[diggable_like].graphic[ACTION_DIGGING]; - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) element_info[i].direction_graphic[ACTION_DIGGING][dir] = element_info[diggable_like].direction_graphic[ACTION_DIGGING][dir]; } @@ -489,7 +489,7 @@ void InitElementGraphicInfo() if (graphic > 0 && graphic_info[graphic].bitmap == NULL) element_info[i].crumbled[act] = -1; - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) { graphic = element_info[i].direction_graphic[act][dir]; if (graphic > 0 && graphic_info[graphic].bitmap == NULL) @@ -508,7 +508,7 @@ void InitElementGraphicInfo() { for (act = 0; act < NUM_ACTIONS; act++) { - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) { int graphic = element_info[i].direction_graphic[act][dir]; int move_dir = (act == ACTION_FALLING ? MV_BIT_DOWN : dir); @@ -566,8 +566,8 @@ void InitElementGraphicInfo() { int default_graphic = element_info[i].graphic[ACTION_DEFAULT]; int default_crumbled = element_info[i].crumbled[ACTION_DEFAULT]; - int default_direction_graphic[NUM_DIRECTIONS]; - int default_direction_crumbled[NUM_DIRECTIONS]; + int default_direction_graphic[NUM_DIRECTIONS_FULL]; + int default_direction_crumbled[NUM_DIRECTIONS_FULL]; if (default_graphic == -1) default_graphic = IMG_UNKNOWN; @@ -580,7 +580,7 @@ void InitElementGraphicInfo() default_crumbled = IMG_EMPTY; #endif - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) { default_direction_graphic[dir] = element_info[i].direction_graphic[ACTION_DEFAULT][dir]; @@ -653,7 +653,7 @@ void InitElementGraphicInfo() default_action_crumbled = default_crumbled; #endif - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) { /* use action graphic as the default direction graphic, if undefined */ int default_action_direction_graphic = element_info[i].graphic[act]; @@ -725,7 +725,7 @@ void InitElementGraphicInfo() if (graphic_info[crumbled].anim_frames == 1) graphic_info[crumbled].anim_mode = ANIM_NONE; - for (dir = 0; dir < NUM_DIRECTIONS; dir++) + for (dir = 0; dir < NUM_DIRECTIONS_FULL; dir++) { graphic = element_info[i].direction_graphic[act][dir]; crumbled = element_info[i].direction_crumbled[act][dir]; @@ -1681,7 +1681,7 @@ static int get_special_property_bit(int element, int property_bit_nr) { EL_SP_MURPHY, 0 }, { EL_SOKOBAN_FIELD_PLAYER, 0 }, - /* all element that can move may be able to also move into acid */ + /* all elements that can move may be able to also move into acid */ { EL_BUG, 1 }, { EL_BUG_LEFT, 1 }, { EL_BUG_RIGHT, 1 }, @@ -1723,6 +1723,7 @@ static int get_special_property_bit(int element, int property_bit_nr) { EL_SP_ELECTRON, 15 }, { EL_BALLOON, 16 }, { EL_SPRING, 17 }, + { EL_EMC_ANDROID, 18 }, { -1, -1 }, }; @@ -1788,6 +1789,55 @@ boolean getBitfieldProperty(int *bitfield, int property_bit_nr, int element) return FALSE; } +#if 1 +static void resolve_group_element(int group_element, int recursion_depth) +{ + static int group_nr; + static struct ElementGroupInfo *group; + struct ElementGroupInfo *actual_group = element_info[group_element].group; + int i; + + if (actual_group == NULL) /* not yet initialized */ + return; + + if (recursion_depth > NUM_GROUP_ELEMENTS) /* recursion too deep */ + { + Error(ERR_WARN, "recursion too deep when resolving group element %d", + group_element - EL_GROUP_START + 1); + + /* replace element which caused too deep recursion by question mark */ + group->element_resolved[group->num_elements_resolved++] = EL_UNKNOWN; + + return; + } + + if (recursion_depth == 0) /* initialization */ + { + group = actual_group; + group_nr = group_element - EL_GROUP_START; + + group->num_elements_resolved = 0; + group->choice_pos = 0; + } + + for (i = 0; i < actual_group->num_elements; i++) + { + int element = actual_group->element[i]; + + if (group->num_elements_resolved == NUM_FILE_ELEMENTS) + break; + + if (IS_GROUP_ELEMENT(element)) + resolve_group_element(element, recursion_depth + 1); + else + { + group->element_resolved[group->num_elements_resolved++] = element; + element_info[element].in_group[group_nr] = TRUE; + } + } +} +#endif + void InitElementPropertiesStatic() { static int ep_diggable[] = @@ -1809,6 +1859,7 @@ void InitElementPropertiesStatic() EL_SP_BUGGY_BASE_ACTIVE, EL_EMC_PLANT, #endif + -1 }; @@ -1833,6 +1884,7 @@ void InitElementPropertiesStatic() EL_EMC_KEY_7, EL_EMC_KEY_8, EL_DYNAMITE, + EL_EM_DYNAMITE, EL_DYNABOMB_INCREASE_NUMBER, EL_DYNABOMB_INCREASE_SIZE, EL_DYNABOMB_INCREASE_POWER, @@ -1851,6 +1903,7 @@ void InitElementPropertiesStatic() EL_SPEED_PILL, EL_EMC_LENSES, EL_EMC_MAGNIFIER, + -1 }; @@ -1881,6 +1934,7 @@ void InitElementPropertiesStatic() EL_SP_BUGGY_BASE_ACTIVE, EL_EMC_PLANT, #endif + -1 }; @@ -1899,6 +1953,7 @@ void InitElementPropertiesStatic() EL_PACMAN, EL_SP_SNIKSNAK, EL_SP_ELECTRON, + -1 }; @@ -1908,6 +1963,7 @@ void InitElementPropertiesStatic() EL_SPACESHIP, EL_BD_BUTTERFLY, EL_BD_FIREFLY, + -1 }; @@ -2028,6 +2084,7 @@ void InitElementPropertiesStatic() EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, EL_TUBE_RIGHT_DOWN, + -1 }; @@ -2069,6 +2126,9 @@ void InitElementPropertiesStatic() EL_EMC_WALL_SLIPPERY_2, EL_EMC_WALL_SLIPPERY_3, EL_EMC_WALL_SLIPPERY_4, + EL_EMC_MAGIC_BALL, + EL_EMC_MAGIC_BALL_ACTIVE, + -1 }; @@ -2098,6 +2158,7 @@ void InitElementPropertiesStatic() EL_BALLOON, EL_SPRING, EL_EMC_ANDROID, + -1 }; @@ -2126,6 +2187,7 @@ void InitElementPropertiesStatic() EL_CRYSTAL, EL_SPRING, EL_DX_SUPABOMB, + -1 }; @@ -2151,6 +2213,7 @@ void InitElementPropertiesStatic() EL_CRYSTAL, EL_SPRING, EL_DX_SUPABOMB, + -1 }; @@ -2159,6 +2222,7 @@ void InitElementPropertiesStatic() EL_ROCK, EL_BD_ROCK, EL_SP_ZONK, + -1 }; @@ -2167,6 +2231,7 @@ void InitElementPropertiesStatic() EL_ROCK, EL_BD_ROCK, EL_SP_ZONK, + -1 }; @@ -2184,8 +2249,10 @@ void InitElementPropertiesStatic() EL_MOLE, /* new elements */ - EL_DYNAMITE_ACTIVE, EL_DYNAMITE, + EL_DYNAMITE_ACTIVE, + EL_EM_DYNAMITE, + EL_EM_DYNAMITE_ACTIVE, EL_DYNABOMB_PLAYER_1_ACTIVE, EL_DYNABOMB_PLAYER_2_ACTIVE, EL_DYNABOMB_PLAYER_3_ACTIVE, @@ -2203,6 +2270,7 @@ void InitElementPropertiesStatic() #if 0 EL_BLACK_ORB, #endif + -1 }; @@ -2218,6 +2286,7 @@ void InitElementPropertiesStatic() EL_PIG, EL_DRAGON, EL_MOLE, + -1 }; @@ -2226,6 +2295,7 @@ void InitElementPropertiesStatic() EL_BOMB, EL_SP_DISK_ORANGE, EL_DX_SUPABOMB, + -1 }; @@ -2252,6 +2322,7 @@ void InitElementPropertiesStatic() EL_PENGUIN, EL_PIG, EL_DRAGON, + -1 }; @@ -2268,6 +2339,7 @@ void InitElementPropertiesStatic() EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, EL_TUBE_RIGHT_DOWN, + -1 }; @@ -2304,6 +2376,7 @@ void InitElementPropertiesStatic() EL_EMC_GATE_8_GRAY_ACTIVE, EL_SWITCHGATE_OPEN, EL_TIMEGATE_OPEN, + -1 }; @@ -2328,6 +2401,7 @@ void InitElementPropertiesStatic() EL_SP_GRAVITY_OFF_PORT_RIGHT, EL_SP_GRAVITY_OFF_PORT_UP, EL_SP_GRAVITY_OFF_PORT_DOWN, + -1 }; @@ -2363,6 +2437,7 @@ void InitElementPropertiesStatic() EL_SP_DISK_YELLOW, EL_BALLOON, EL_EMC_ANDROID, + -1 }; @@ -2434,6 +2509,7 @@ void InitElementPropertiesStatic() EL_SP_GRAVITY_OFF_PORT_RIGHT, EL_SP_GRAVITY_OFF_PORT_UP, EL_SP_GRAVITY_OFF_PORT_DOWN, + -1 }; @@ -2456,8 +2532,10 @@ void InitElementPropertiesStatic() EL_MOLE, /* elements that can explode by explosion or by dragonfire */ - EL_DYNAMITE_ACTIVE, EL_DYNAMITE, + EL_DYNAMITE_ACTIVE, + EL_EM_DYNAMITE, + EL_EM_DYNAMITE_ACTIVE, EL_DYNABOMB_PLAYER_1_ACTIVE, EL_DYNABOMB_PLAYER_2_ACTIVE, EL_DYNABOMB_PLAYER_3_ACTIVE, @@ -2475,6 +2553,7 @@ void InitElementPropertiesStatic() /* elements that can explode only by explosion */ EL_BLACK_ORB, + -1 }; @@ -2505,6 +2584,7 @@ void InitElementPropertiesStatic() EL_SP_GRAVITY_OFF_PORT_UP, EL_SP_GRAVITY_OFF_PORT_DOWN, EL_EMC_GRASS, + -1 }; @@ -2517,6 +2597,7 @@ void InitElementPropertiesStatic() EL_SP_MURPHY, EL_SOKOBAN_FIELD_PLAYER, EL_TRIGGER_PLAYER, + -1 }; @@ -2530,6 +2611,7 @@ void InitElementPropertiesStatic() EL_EMERALD_RED, EL_EMERALD_PURPLE, EL_DIAMOND, + -1 }; @@ -2563,6 +2645,8 @@ void InitElementPropertiesStatic() EL_LAMP, EL_TIME_ORB_FULL, EL_EMC_MAGIC_BALL_SWITCH, + EL_EMC_MAGIC_BALL_SWITCH_ACTIVE, + -1 }; @@ -2596,6 +2680,7 @@ void InitElementPropertiesStatic() EL_BD_AMOEBA, EL_CHAR_QUESTION, EL_UNKNOWN, + -1 }; @@ -2670,6 +2755,7 @@ void InitElementPropertiesStatic() EL_SP_BUGGY_BASE_ACTIVE, EL_SP_EXIT_OPENING, EL_SP_EXIT_CLOSING, + -1 }; @@ -2686,6 +2772,7 @@ void InitElementPropertiesStatic() EL_PLAYER_3, EL_PLAYER_4, EL_INVISIBLE_STEELWALL, + -1 }; @@ -2697,6 +2784,7 @@ void InitElementPropertiesStatic() EL_EMERALD_RED, EL_EMERALD_PURPLE, EL_DIAMOND, + -1 }; @@ -2724,6 +2812,7 @@ void InitElementPropertiesStatic() EL_DIAMOND, EL_PEARL, EL_CRYSTAL, + -1 }; @@ -2737,6 +2826,7 @@ void InitElementPropertiesStatic() EL_DIAMOND, EL_PEARL, EL_CRYSTAL, + -1 }; @@ -2748,6 +2838,7 @@ void InitElementPropertiesStatic() EL_EMERALD_RED, EL_EMERALD_PURPLE, EL_DIAMOND, + -1 }; @@ -2826,6 +2917,7 @@ void InitElementPropertiesStatic() EL_EMC_WALL_6, EL_EMC_WALL_7, EL_EMC_WALL_8, + -1 }; @@ -2989,6 +3081,7 @@ void InitElementPropertiesStatic() EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, EL_TUBE_RIGHT_DOWN, + -1 }; @@ -3005,6 +3098,7 @@ void InitElementPropertiesStatic() EL_PACMAN, EL_SP_SNIKSNAK, EL_SP_ELECTRON, + -1 }; @@ -3022,6 +3116,7 @@ void InitElementPropertiesStatic() EL_CONVEYOR_BELT_4_LEFT, EL_CONVEYOR_BELT_4_MIDDLE, EL_CONVEYOR_BELT_4_RIGHT, + -1 }; @@ -3039,6 +3134,7 @@ void InitElementPropertiesStatic() EL_CONVEYOR_BELT_4_LEFT_ACTIVE, EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE, EL_CONVEYOR_BELT_4_RIGHT_ACTIVE, + -1 }; @@ -3056,6 +3152,7 @@ void InitElementPropertiesStatic() EL_CONVEYOR_BELT_4_SWITCH_LEFT, EL_CONVEYOR_BELT_4_SWITCH_MIDDLE, EL_CONVEYOR_BELT_4_SWITCH_RIGHT, + -1 }; @@ -3072,6 +3169,7 @@ void InitElementPropertiesStatic() EL_TUBE_VERTICAL_LEFT, EL_TUBE_VERTICAL_RIGHT, EL_TUBE_ANY, + -1 }; @@ -3113,6 +3211,7 @@ void InitElementPropertiesStatic() EL_EMC_GATE_6_GRAY_ACTIVE, EL_EMC_GATE_7_GRAY_ACTIVE, EL_EMC_GATE_8_GRAY_ACTIVE, + -1 }; @@ -3123,6 +3222,8 @@ void InitElementPropertiesStatic() EL_AMOEBA_DRY, EL_AMOEBA_FULL, EL_BD_AMOEBA, + EL_EMC_DRIPPER, + -1 }; @@ -3132,10 +3233,12 @@ void InitElementPropertiesStatic() EL_AMOEBA_DRY, EL_AMOEBA_FULL, EL_BD_AMOEBA, + EL_EMC_DRIPPER, + -1 }; - static int ep_has_content[] = + static int ep_has_editor_content[] = { EL_PLAYER_1, EL_PLAYER_2, @@ -3148,6 +3251,8 @@ void InitElementPropertiesStatic() EL_AMOEBA_FULL, EL_BD_AMOEBA, EL_EMC_MAGIC_BALL, + EL_EMC_ANDROID, + -1 }; @@ -3166,17 +3271,21 @@ void InitElementPropertiesStatic() EL_AMOEBA_FULL, EL_GAME_OF_LIFE, EL_BIOMAZE, + EL_EMC_DRIPPER, + -1 }; static int ep_active_bomb[] = { EL_DYNAMITE_ACTIVE, + EL_EM_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 }; @@ -3241,6 +3350,7 @@ void InitElementPropertiesStatic() EL_EMC_GATE_7_GRAY_ACTIVE, EL_EMC_GATE_8_GRAY_ACTIVE, EL_DYNAMITE, + EL_EM_DYNAMITE, EL_INVISIBLE_STEELWALL, EL_INVISIBLE_WALL, EL_INVISIBLE_SAND, @@ -3361,6 +3471,7 @@ void InitElementPropertiesStatic() EL_EMC_WALL_14, EL_EMC_WALL_15, EL_EMC_WALL_16, + -1 }; @@ -3375,6 +3486,7 @@ void InitElementPropertiesStatic() EL_LANDMINE, EL_TRAP, EL_TRAP_ACTIVE, + -1 }; @@ -3394,6 +3506,7 @@ void InitElementPropertiesStatic() EL_INTERNAL_CASCADE_USER_ACTIVE, EL_INTERNAL_CASCADE_GENERIC_ACTIVE, EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE, + -1 }; @@ -3413,6 +3526,7 @@ void InitElementPropertiesStatic() EL_INTERNAL_CASCADE_USER, EL_INTERNAL_CASCADE_GENERIC, EL_INTERNAL_CASCADE_DYNAMIC, + -1 }; @@ -3473,7 +3587,7 @@ void InitElementPropertiesStatic() { ep_keygate, EP_KEYGATE }, { ep_amoeboid, EP_AMOEBOID }, { ep_amoebalive, EP_AMOEBALIVE }, - { ep_has_content, EP_HAS_CONTENT }, + { ep_has_editor_content, EP_HAS_EDITOR_CONTENT }, { ep_can_turn_each_move, EP_CAN_TURN_EACH_MOVE }, { ep_can_grow, EP_CAN_GROW }, { ep_active_bomb, EP_ACTIVE_BOMB }, @@ -3549,6 +3663,17 @@ void InitElementPropertiesEngine(int engine_version) property (which means that conditional property changes must be set to a reliable default value before) */ +#if 1 + /* ---------- recursively resolve group elements ------------------------- */ + + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + for (j = 0; j < NUM_GROUP_ELEMENTS; j++) + element_info[i].in_group[j] = FALSE; + + for (i = 0; i < NUM_GROUP_ELEMENTS; i++) + resolve_group_element(EL_GROUP_START + i, 0); +#endif + /* set all special, combined or engine dependent element properties */ for (i = 0; i < MAX_NUM_ELEMENTS; i++) { @@ -3688,6 +3813,12 @@ void InitElementPropertiesEngine(int engine_version) SET_PROPERTY(i, EP_SP_PORT, (IS_SP_ELEMENT(i) && IS_PASSABLE_INSIDE(i))); + /* ---------- CAN_BE_CLONED_BY_ANDROID --------------------------------- */ + for (j = 0; j < level.num_android_clone_elements; j++) + SET_PROPERTY(i, EP_CAN_BE_CLONED_BY_ANDROID, + (i != EL_EMPTY && + IS_EQUAL_OR_IN_GROUP(i, level.android_clone_element[j]))); + /* ---------- CAN_CHANGE ----------------------------------------------- */ SET_PROPERTY(i, EP_CAN_CHANGE, FALSE); /* default: cannot change */ for (j = 0; j < element_info[i].num_change_pages; j++) @@ -4075,7 +4206,7 @@ static void InitArtworkConfig() static char *sound_id_prefix[2 * MAX_NUM_ELEMENTS + 1]; static char *music_id_prefix[NUM_MUSIC_PREFIXES + 1]; static char *action_id_suffix[NUM_ACTIONS + 1]; - static char *direction_id_suffix[NUM_DIRECTIONS + 1]; + static char *direction_id_suffix[NUM_DIRECTIONS_FULL + 1]; static char *special_id_suffix[NUM_SPECIAL_GFX_ARGS + 1]; static char *level_id_suffix[MAX_LEVELS + 1]; static char *dummy[1] = { NULL }; @@ -4149,9 +4280,9 @@ static void InitArtworkConfig() action_id_suffix[i] = element_action_info[i].suffix; action_id_suffix[NUM_ACTIONS] = NULL; - for (i = 0; i < NUM_DIRECTIONS; i++) + for (i = 0; i < NUM_DIRECTIONS_FULL; i++) direction_id_suffix[i] = element_direction_info[i].suffix; - direction_id_suffix[NUM_DIRECTIONS] = NULL; + direction_id_suffix[NUM_DIRECTIONS_FULL] = NULL; for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++) special_id_suffix[i] = special_suffix_info[i].suffix;