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,
-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,
-1
};
- static int ep_can_explode[] =
+ static int ep_can_change[] =
{
- 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_can_move[] =
{
- /* 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,
-1
};
- static int ep_can_smash[] =
+ static int ep_can_smash_player[] =
{
EL_ROCK,
EL_BD_ROCK,
-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,
-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_SP_SNIKSNAK,
- EL_SP_ELECTRON,
-
- 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_bd_element[] =
{
EL_EMPTY,
-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,
{
{ 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 },
{ 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_switchable, EP_SWITCHABLE },
- { 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_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 },
{ 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++)
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)
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,
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
};
!IS_WALKABLE_OVER(i) &&
!IS_WALKABLE_UNDER(i)));
- /* ---------- ENEMY ---------------------------------------------------- */
- if (DONT_TOUCH(i))
- SET_PROPERTY(i, EP_ENEMY, TRUE);
+ 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)));
- /* ---------- DONT_GO_TO ----------------------------------------------- */
- if (IS_ENEMY(i))
- SET_PROPERTY(i, EP_DONT_GO_TO, TRUE);
+ /* ---------- CAN_EXPLODE ---------------------------------------------- */
+ SET_PROPERTY(i, EP_CAN_EXPLODE, (CAN_EXPLODE_BY_FIRE(i) ||
+ CAN_EXPLODE_SMASHED(i) ||
+ CAN_EXPLODE_BY_FIRE(i)));
}
#if 0