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;
if (action < 0)
action = ACTION_DEFAULT;
+ if (direction < 0)
+ for (dir=0; dir<NUM_DIRECTIONS; dir++)
+ element_info[element].direction_graphic[action][dir] = -1;
+
if (direction > -1)
element_info[element].direction_graphic[action][direction] = graphic;
else
for (act=0; act<NUM_ACTIONS; act++)
{
- boolean act_empty = (act == ACTION_DIGGING ||
- act == ACTION_SNAPPING ||
- act == ACTION_COLLECTING);
+ boolean act_remove = (act == ACTION_DIGGING ||
+ act == ACTION_SNAPPING ||
+ act == ACTION_COLLECTING);
for (dir=0; dir<NUM_DIRECTIONS; dir++)
{
/* no graphic for current action -- use default direction graphic */
if (default_direction_graphic == -1)
default_direction_graphic =
- (act_empty ? IMG_EMPTY : default_action_direction_graphic[dir]);
+ (act_remove ? IMG_EMPTY : default_action_direction_graphic[dir]);
if (element_info[i].direction_graphic[act][dir] == -1)
element_info[i].direction_graphic[act][dir] =
/* no graphic for this specific action -- use default action graphic */
if (element_info[i].graphic[act] == -1)
element_info[i].graphic[act] =
- (act_empty ? IMG_EMPTY : default_action_graphic);
+ (act_remove ? IMG_EMPTY : default_action_graphic);
}
}
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;
EL_TRAP,
EL_INVISIBLE_SAND,
EL_INVISIBLE_SAND_ACTIVE,
-#if 1
+
+ /* !!! currently not diggable, but handled by 'ep_dont_go_to' !!! */
+#if 0
EL_LANDMINE,
EL_TRAP_ACTIVE,
EL_SP_BUGGY_BASE_ACTIVE,
-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_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,
+ 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,
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
};
-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
};
- static int ep_can_change[] =
+ static int ep_can_pass_magic_wall[] =
{
EL_ROCK,
EL_BD_ROCK,
-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_dont_touch[] =
{
EL_BUG,
EL_SPACESHIP,
EL_BD_BUTTERFLY,
EL_BD_FIREFLY,
+
EL_YAMYAM,
EL_DARK_YAMYAM,
EL_ROBOT,
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_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,
- -1
- };
-
- static int ep_explosive[] =
- {
- 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,
+#endif
-1
};
static int ep_gem[] =
{
- EL_EMERALD,
EL_BD_DIAMOND,
+ EL_EMERALD,
EL_EMERALD_YELLOW,
EL_EMERALD_RED,
EL_EMERALD_PURPLE,
-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,
{ ep_player, EP_PLAYER },
{ ep_can_be_crumbled, EP_CAN_BE_CRUMBLED },
{ ep_can_move, EP_CAN_MOVE },
- { ep_can_change, EP_CAN_CHANGE },
+ { 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_explosive, EP_EXPLOSIVE },
+ { 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_MAUER,
EP_CAN_FALL,
EP_CAN_SMASH,
- EP_CAN_CHANGE,
+ EP_CAN_PASS_MAGIC_WALL,
EP_CAN_MOVE,
EP_DONT_TOUCH,
EP_DONT_GO_TO,
EP_GEM,
- EP_EXPLOSIVE,
+ EP_CAN_EXPLODE,
EP_PUSHABLE,
EP_PLAYER,
EP_HAS_CONTENT,
int i, j;
+#if 0
+ InitElementPropertiesStatic();
+#endif
+
/* set all special, combined or engine dependant element properties */
for (i=0; i < MAX_NUM_ELEMENTS; i++)
{
+#if 0
+ for (j=EP_ACCESSIBLE_OVER; j < NUM_ELEMENT_PROPERTIES; j++)
+ SET_PROPERTY(i, j, FALSE);
+#endif
+
/* ---------- INACTIVE ------------------------------------------------- */
if (i >= EL_CHAR_START && i <= EL_CHAR_END)
SET_PROPERTY(i, EP_INACTIVE, TRUE);
/* ---------- WALKABLE, PASSABLE, ACCESSIBLE --------------------------- */
- if (IS_WALKABLE_OVER(i) || IS_WALKABLE_INSIDE(i) || IS_WALKABLE_UNDER(i))
- SET_PROPERTY(i, EP_WALKABLE, TRUE);
+ 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)));
- if (IS_PASSABLE_OVER(i) || IS_PASSABLE_INSIDE(i) || IS_PASSABLE_UNDER(i))
- SET_PROPERTY(i, EP_PASSABLE, TRUE);
+ SET_PROPERTY(i, EP_ACCESSIBLE_OVER, (IS_WALKABLE_OVER(i) ||
+ IS_PASSABLE_OVER(i)));
- if (IS_WALKABLE_OVER(i) || IS_PASSABLE_OVER(i))
- SET_PROPERTY(i, EP_ACCESSIBLE_OVER, TRUE);
+ SET_PROPERTY(i, EP_ACCESSIBLE_INSIDE, (IS_WALKABLE_INSIDE(i) ||
+ IS_PASSABLE_INSIDE(i)));
- if (IS_WALKABLE_INSIDE(i) || IS_PASSABLE_INSIDE(i))
- SET_PROPERTY(i, EP_ACCESSIBLE_INSIDE, TRUE);
+ SET_PROPERTY(i, EP_ACCESSIBLE_UNDER, (IS_WALKABLE_UNDER(i) ||
+ IS_PASSABLE_UNDER(i)));
- if (IS_WALKABLE_UNDER(i) || IS_PASSABLE_UNDER(i))
- SET_PROPERTY(i, EP_ACCESSIBLE_UNDER, TRUE);
+ SET_PROPERTY(i, EP_ACCESSIBLE, (IS_WALKABLE(i) ||
+ IS_PASSABLE(i)));
- if (IS_WALKABLE(i) || IS_PASSABLE(i))
- SET_PROPERTY(i, EP_ACCESSIBLE, TRUE);
+ /* ---------- 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 */
!IS_COLLECTIBLE(i)));
/* ---------- DRAGONFIRE_PROOF ----------------------------------------- */
- if (IS_HISTORIC_SOLID(i) || i == EL_EXPLOSION ||
- (IS_CUSTOM_ELEMENT(i) && IS_INDESTRUCTIBLE(i)))
+
+ 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, (IS_INDESTRUCTIBLE(i) &&
!IS_WALKABLE_OVER(i) &&
!IS_WALKABLE_UNDER(i)));
+
+ /* ---------- ENEMY ---------------------------------------------------- */
+ if (DONT_TOUCH(i))
+ SET_PROPERTY(i, EP_ENEMY, TRUE);
+
+ /* ---------- DONT_GO_TO ----------------------------------------------- */
+ if (IS_ENEMY(i))
+ SET_PROPERTY(i, EP_DONT_GO_TO, TRUE);
}
#if 0
(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()
}
}
+void KeyboardAutoRepeatOffUnlessAutoplay()
+{
+ if (global.autoplay_leveldir == NULL)
+ KeyboardAutoRepeatOff();
+}
+
/* ========================================================================= */
/* OpenAll() */