X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=77cf39a00fdba9c92f5f0203782b86aaf47ba1ee;hb=0d7a16964bdac425962c0c0bcaa7488d9664c8d2;hp=d6ede854a841fa36bfa305e99086e7b98e0ab5e7;hpb=2b6391d735c22ee6a77fba6ec9e2d6d72e9c593f;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index d6ede854..77cf39a0 100644 --- a/src/init.c +++ b/src/init.c @@ -428,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; @@ -455,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 @@ -541,6 +558,10 @@ void InitElementSpecialGraphicInfo() boolean base_redefined = getImageListEntry(el2img(element))->redefined; 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; @@ -1080,7 +1101,7 @@ void InitElementPropertiesStatic() EL_INVISIBLE_SAND, EL_INVISIBLE_SAND_ACTIVE, - /* !!! currently not diggable, but handled by 'ep_dont_go_to' !!! */ + /* !!! currently not diggable, but handled by 'ep_dont_run_into' !!! */ #if 0 EL_LANDMINE, EL_TRAP_ACTIVE, @@ -1122,6 +1143,62 @@ void InitElementPropertiesStatic() -1 }; + static int ep_dont_run_into[] = + { + /* 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_dont_collide_with[] = + { + /* same elements as in 'ep_dont_touch' */ + EL_BUG, + EL_SPACESHIP, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, + + /* 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 + }; + static int ep_indestructible[] = { EL_STEELWALL, @@ -1196,10 +1273,18 @@ void InitElementPropertiesStatic() 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, @@ -1251,6 +1336,33 @@ void InitElementPropertiesStatic() -1 }; + static int ep_can_change[] = + { + -1 + }; + + static int ep_can_move[] = + { + 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_fall[] = { EL_ROCK, @@ -1279,7 +1391,7 @@ void InitElementPropertiesStatic() -1 }; - static int ep_can_smash[] = + static int ep_can_smash_player[] = { EL_ROCK, EL_BD_ROCK, @@ -1304,6 +1416,78 @@ void InitElementPropertiesStatic() -1 }; + static int ep_can_smash_enemies[] = + { + EL_ROCK, + EL_BD_ROCK, + EL_SP_ZONK, + -1 + }; + + static int ep_can_smash_everything[] = + { + 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_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, + -1 + }; + + 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_can_explode_impact[] = + { + EL_BOMB, + EL_SP_DISK_ORANGE, + EL_DX_SUPABOMB, + -1 + }; + static int ep_walkable_over[] = { EL_EMPTY_SPACE, @@ -1382,28 +1566,19 @@ void InitElementPropertiesStatic() static int ep_pushable[] = { EL_ROCK, - EL_BD_ROCK, EL_BOMB, + EL_DX_SUPABOMB, EL_NUT, EL_TIME_ORB_EMPTY, - EL_SOKOBAN_FIELD_FULL, - EL_SOKOBAN_OBJECT, - EL_SATELLITE, EL_SP_ZONK, EL_SP_DISK_ORANGE, + EL_SPRING, + EL_BD_ROCK, + EL_SOKOBAN_OBJECT, + EL_SOKOBAN_FIELD_FULL, + EL_SATELLITE, EL_SP_DISK_YELLOW, EL_BALLOON, - EL_SPRING, - EL_DX_SUPABOMB, - -1 - }; - - static int ep_player[] = - { - EL_PLAYER_1, - EL_PLAYER_2, - EL_PLAYER_3, - EL_PLAYER_4, -1 }; @@ -1416,48 +1591,12 @@ void InitElementPropertiesStatic() -1 }; - static int ep_can_move[] = + static int ep_player[] = { - /* only stored in level file */ - 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, - - /* 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, + EL_PLAYER_1, + EL_PLAYER_2, + EL_PLAYER_3, + EL_PLAYER_4, -1 }; @@ -1474,79 +1613,34 @@ void InitElementPropertiesStatic() -1 }; - static int ep_dont_touch[] = - { - EL_BUG, - EL_SPACESHIP, - EL_BD_BUTTERFLY, - EL_BD_FIREFLY, - -1 - }; - - 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, - -1 - }; - - static int ep_dont_go_to[] = - { - 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, - - /* !!! 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_can_explode[] = + static int ep_switchable[] = { - 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_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 }; @@ -1928,6 +2022,22 @@ void InitElementPropertiesStatic() -1 }; + static int ep_classic_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, + -1 + }; + static int ep_belt[] = { EL_CONVEYOR_BELT_1_LEFT, @@ -2200,10 +2310,20 @@ void InitElementPropertiesStatic() { { 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_can_change, EP_CAN_CHANGE }, + { ep_can_move, EP_CAN_MOVE }, { ep_can_fall, EP_CAN_FALL }, - { ep_can_smash, EP_CAN_SMASH }, + { 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 }, @@ -2212,14 +2332,11 @@ void InitElementPropertiesStatic() { 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_player, EP_PLAYER }, { 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_switchable, EP_SWITCHABLE }, { ep_bd_element, EP_BD_ELEMENT }, { ep_sp_element, EP_SP_ELEMENT }, { ep_sb_element, EP_SB_ELEMENT }, @@ -2229,6 +2346,7 @@ void InitElementPropertiesStatic() { 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 }, @@ -2243,7 +2361,40 @@ void InitElementPropertiesStatic() { NULL, -1 } }; - int i, j; + 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++) @@ -2255,6 +2406,13 @@ void InitElementPropertiesStatic() 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) @@ -2265,16 +2423,16 @@ void InitElementPropertiesEngine(int engine_version) EP_AMOEBALIVE, EP_AMOEBOID, EP_PFORTE, - EP_ENEMY, + EP_DONT_COLLIDE_WITH, EP_MAUER, EP_CAN_FALL, EP_CAN_SMASH, EP_CAN_PASS_MAGIC_WALL, EP_CAN_MOVE, EP_DONT_TOUCH, - EP_DONT_GO_TO, + EP_DONT_RUN_INTO, EP_GEM, - EP_CAN_EXPLODE, + EP_CAN_EXPLODE_BY_FIRE, EP_PUSHABLE, EP_PLAYER, EP_HAS_CONTENT, @@ -2294,26 +2452,31 @@ void InitElementPropertiesEngine(int engine_version) static int no_wall_properties[] = { - EP_AMOEBALIVE, - EP_AMOEBOID, - EP_CAN_BE_CRUMBLED, - EP_ENEMY, - EP_CAN_FALL, - EP_CAN_SMASH, + EP_DIGGABLE, + EP_COLLECTIBLE, + EP_DONT_RUN_INTO, + EP_DONT_COLLIDE_WITH, EP_CAN_MOVE, - EP_DONT_GO_TO, - EP_FOOD_DARK_YAMYAM, - EP_GEM, - EP_FOOD_PENGUIN, + EP_CAN_FALL, + EP_CAN_SMASH_PLAYER, + EP_CAN_SMASH_ENEMIES, + EP_CAN_SMASH_EVERYTHING, EP_PUSHABLE, + + EP_CAN_BE_CRUMBLED, + EP_PLAYER, - EP_ACCESSIBLE, - EP_DIGGABLE, - EP_COLLECTIBLE, - EP_ACTIVE_BOMB, + EP_GEM, + EP_FOOD_DARK_YAMYAM, + EP_FOOD_PENGUIN, EP_BELT, EP_BELT_ACTIVE, EP_TUBE, + EP_AMOEBOID, + EP_AMOEBALIVE, + EP_ACTIVE_BOMB, + + EP_ACCESSIBLE, -1 }; @@ -2356,6 +2519,12 @@ void InitElementPropertiesEngine(int engine_version) SET_PROPERTY(i, EP_ACCESSIBLE, (IS_WALKABLE(i) || IS_PASSABLE(i))); + /* ---------- SNAPPABLE ------------------------------------------------ */ + SET_PROPERTY(i, EP_SNAPPABLE, (IS_DIGGABLE(i) || + IS_COLLECTIBLE(i) || + IS_SWITCHABLE(i) || + i == EL_BD_ROCK)); + /* ---------- WALL ----------------------------------------------------- */ SET_PROPERTY(i, EP_WALL, TRUE); /* default: element is wall */ @@ -2392,6 +2561,31 @@ void InitElementPropertiesEngine(int engine_version) 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 @@ -2436,6 +2630,20 @@ void InitElementPropertiesEngine(int engine_version) (level.em_slippery_gems && engine_version > VERSION_IDENT(2,0,1))); } + + /* 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; + + element_info[element].push_delay_fixed = 2; + element_info[element].push_delay_random = 8; + } + } } static void InitGlobal()