#include "network.h"
#include "netserv.h"
#include "cartoons.h"
+#include "config.h"
#include "conf_e2g.c" /* include auto-generated data structure definitions */
#include "conf_esg.c" /* include auto-generated data structure definitions */
/* ---------- initialize font graphic definitions ---------- */
/* always start with reliable default values (normal font graphics) */
+#if 1
+ for (i=0; i < NUM_FONTS; i++)
+ font_info[i].graphic = IMG_FONT_INITIAL_1;
+#else
for (i=0; i < NUM_FONTS; i++)
font_info[i].graphic = FONT_INITIAL_1;
+#endif
/* initialize normal font/graphic mapping from static configuration */
for (i=0; font_to_graphic[i].font_nr > -1; i++)
boolean act_remove = ((IS_DIGGABLE(i) && act == ACTION_DIGGING) ||
(IS_SNAPPABLE(i) && act == ACTION_SNAPPING) ||
(IS_COLLECTIBLE(i) && act == ACTION_COLLECTING));
+ boolean act_turning = (act == ACTION_TURNING_FROM_LEFT ||
+ act == ACTION_TURNING_FROM_RIGHT ||
+ act == ACTION_TURNING_FROM_UP ||
+ act == ACTION_TURNING_FROM_DOWN);
/* generic default action graphic (defined by "[default]" directive) */
int default_action_graphic = element_info[EL_DEFAULT].graphic[act];
/* no graphic for current action -- use default direction graphic */
if (default_action_direction_graphic == -1)
default_action_direction_graphic =
- (act_remove ? IMG_EMPTY : default_direction_graphic[dir]);
+ (act_remove ? IMG_EMPTY :
+ act_turning ?
+ element_info[i].direction_graphic[ACTION_TURNING][dir] :
+ default_direction_graphic[dir]);
if (default_action_direction_crumbled == -1)
default_action_direction_crumbled =
- (act_remove ? IMG_EMPTY : default_direction_crumbled[dir]);
+ (act_remove ? IMG_EMPTY :
+ act_turning ?
+ element_info[i].direction_crumbled[ACTION_TURNING][dir] :
+ default_direction_crumbled[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_remove ? IMG_EMPTY : default_action_graphic);
+ (act_remove ? IMG_EMPTY :
+ act_turning ? element_info[i].graphic[ACTION_TURNING] :
+ default_action_graphic);
if (element_info[i].crumbled[act] == -1)
element_info[i].crumbled[act] =
- (act_remove ? IMG_EMPTY : default_action_crumbled);
+ (act_remove ? IMG_EMPTY :
+ act_turning ? element_info[i].crumbled[ACTION_TURNING] :
+ default_action_crumbled);
+ }
+ }
+
+#if 1
+ /* set animation mode to "none" for each graphic with only 1 frame */
+ for (i=0; i<MAX_NUM_ELEMENTS; i++)
+ {
+ for (act=0; act<NUM_ACTIONS; act++)
+ {
+ int graphic = element_info[i].graphic[act];
+ int crumbled = element_info[i].crumbled[act];
+
+ if (graphic_info[graphic].anim_frames == 1)
+ graphic_info[graphic].anim_mode = ANIM_NONE;
+ if (graphic_info[crumbled].anim_frames == 1)
+ graphic_info[crumbled].anim_mode = ANIM_NONE;
+
+ for (dir=0; dir<NUM_DIRECTIONS; dir++)
+ {
+ graphic = element_info[i].direction_graphic[act][dir];
+ crumbled = element_info[i].direction_crumbled[act][dir];
+
+ if (graphic_info[graphic].anim_frames == 1)
+ graphic_info[graphic].anim_mode = ANIM_NONE;
+ if (graphic_info[crumbled].anim_frames == 1)
+ graphic_info[crumbled].anim_mode = ANIM_NONE;
+ }
}
}
+#endif
#if 0
#if DEBUG
graphic_info[graphic].anim_delay = 1;
graphic_info[graphic].anim_mode = parameter[GFX_ARG_ANIM_MODE];
+#if 0
if (graphic_info[graphic].anim_frames == 1)
graphic_info[graphic].anim_mode = ANIM_NONE;
+#endif
/* automatically determine correct start frame, if not defined */
if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE)
EL_SHIELD_NORMAL,
EL_SHIELD_DEADLY,
EL_EXTRA_TIME,
- EL_ENVELOPE,
+ EL_ENVELOPE_1,
+ EL_ENVELOPE_2,
+ EL_ENVELOPE_3,
+ EL_ENVELOPE_4,
EL_SPEED_PILL,
-1
};
/* !!! maybe this should better be handled by 'ep_diggable' !!! */
#if 1
- EL_SP_BUGGY_BASE_ACTIVE,
- EL_TRAP_ACTIVE,
EL_LANDMINE,
+ EL_TRAP_ACTIVE,
+ EL_SP_BUGGY_BASE_ACTIVE,
#endif
-1
};
EL_SOKOBAN_FIELD_EMPTY,
EL_EXIT_OPEN,
EL_SP_EXIT_OPEN,
+ EL_SP_EXIT_OPENING,
EL_GATE_1,
EL_GATE_2,
EL_GATE_3,
-1
};
+ static int ep_droppable[] =
+ {
+ -1
+ };
+
+ static int ep_can_explode_1x1[] =
+ {
+ -1
+ };
+
static int ep_pushable[] =
{
EL_ROCK,
-1
};
- static int ep_can_be_crumbled[] =
- {
- EL_SAND,
- EL_LANDMINE,
- EL_TRAP,
- EL_TRAP_ACTIVE,
- -1
- };
-
static int ep_player[] =
{
EL_PLAYER_1,
static int ep_sp_element[] =
{
+ /* should always be valid */
+ EL_EMPTY,
+
EL_SP_EMPTY,
EL_SP_ZONK,
EL_SP_BASE,
EL_SP_TERMINAL_ACTIVE,
EL_SP_BUGGY_BASE_ACTIVATING,
EL_SP_BUGGY_BASE_ACTIVE,
+ EL_SP_EXIT_OPENING,
+ EL_SP_EXIT_CLOSING,
-1
};
-1
};
+ static int ep_em_slippery_wall[] =
+ {
+ -1
+ };
+
+ static int ep_gfx_crumbled[] =
+ {
+ EL_SAND,
+ EL_LANDMINE,
+ EL_TRAP,
+ EL_TRAP_ACTIVE,
+ -1
+ };
+
static struct
{
int *elements;
{ ep_passable_over, EP_PASSABLE_OVER },
{ ep_passable_inside, EP_PASSABLE_INSIDE },
{ ep_passable_under, EP_PASSABLE_UNDER },
+ { ep_droppable, EP_DROPPABLE },
+ { ep_can_explode_1x1, EP_CAN_EXPLODE_1X1 },
{ ep_pushable, EP_PUSHABLE },
- { ep_can_be_crumbled, EP_CAN_BE_CRUMBLED },
-
{ ep_player, EP_PLAYER },
{ ep_can_pass_magic_wall, EP_CAN_PASS_MAGIC_WALL },
{ ep_switchable, EP_SWITCHABLE },
{ ep_active_bomb, EP_ACTIVE_BOMB },
{ ep_inactive, EP_INACTIVE },
+ { ep_em_slippery_wall, EP_EM_SLIPPERY_WALL },
+
+ { ep_gfx_crumbled, EP_GFX_CRUMBLED },
+
{ NULL, -1 }
};
EP_BELT_SWITCH,
EP_WALKABLE_UNDER,
EP_EM_SLIPPERY_WALL,
- EP_CAN_BE_CRUMBLED,
};
#endif
EP_CAN_SMASH_EVERYTHING,
EP_PUSHABLE,
- EP_CAN_BE_CRUMBLED,
-
EP_PLAYER,
EP_GEM,
EP_FOOD_DARK_YAMYAM,
SET_PROPERTY(i, EP_WALL, TRUE);
/* ---------- SOLID_FOR_PUSHING ---------------------------------------- */
- if (engine_version < VERSION_IDENT(2,2,0))
+ if (engine_version < VERSION_IDENT(2,2,0,0))
SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, IS_HISTORIC_SOLID(i));
else
SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, (!IS_WALKABLE(i) &&
/* ---------- EXPLOSION_PROOF ------------------------------------------ */
if (i == EL_FLAMES)
SET_PROPERTY(i, EP_EXPLOSION_PROOF, TRUE);
- else if (engine_version < VERSION_IDENT(2,2,0))
+ else if (engine_version < VERSION_IDENT(2,2,0,0))
SET_PROPERTY(i, EP_EXPLOSION_PROOF, IS_INDESTRUCTIBLE(i));
else
SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) &&
SET_PROPERTY(i, EP_CAN_EXPLODE_3X3, (CAN_EXPLODE(i) &&
!CAN_EXPLODE_1X1(i)));
- /* ---------- CAN_BE_CRUMBLED ------------------------------------------ */
- SET_PROPERTY(i, EP_CAN_BE_CRUMBLED,
- element_info[i].crumbled[ACTION_DEFAULT] != IMG_EMPTY);
-
-#if 0
- if (CAN_BE_CRUMBLED(i))
- printf("::: '%s' can be crumbled [%d]\n",
- element_info[i].token_name,
- element_info[i].crumbled[ACTION_DEFAULT]);
-#endif
-
/* ---------- CAN_CHANGE ----------------------------------------------- */
SET_PROPERTY(i, EP_CAN_CHANGE, FALSE); /* default: cannot change */
for (j=0; j < element_info[i].num_change_pages; j++)
if (element_info[i].change_page[j].can_change)
SET_PROPERTY(i, EP_CAN_CHANGE, TRUE);
+
+ /* ---------- GFX_CRUMBLED --------------------------------------------- */
+ SET_PROPERTY(i, EP_GFX_CRUMBLED,
+ element_info[i].crumbled[ACTION_DEFAULT] != IMG_EMPTY);
}
#if 0
/* "EL_EXPANDABLE_WALL_GROWING" wasn't slippery for EM gems in 2.0.1 */
SET_PROPERTY(EL_EXPANDABLE_WALL_GROWING, EP_EM_SLIPPERY_WALL,
(level.em_slippery_gems &&
- engine_version > VERSION_IDENT(2,0,1)));
+ engine_version > VERSION_IDENT(2,0,1,0)));
}
-#if 0
- /* dynamically adjust element properties according to game engine version */
-#if 0
- if (engine_version < RELEASE_IDENT(2,2,0,7))
-#endif
+#if 1
+ /* set default push delay values (corrected since version 3.0.7-1) */
+ if (engine_version < VERSION_IDENT(3,0,7,1))
{
- for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
- {
- int element = EL_CUSTOM_START + i;
+ game.default_push_delay_fixed = 2;
+ game.default_push_delay_random = 8;
+ }
+ else
+ {
+ game.default_push_delay_fixed = 8;
+ game.default_push_delay_random = 8;
+ }
- element_info[element].push_delay_fixed = 2;
- element_info[element].push_delay_random = 8;
- }
+ /* set uninitialized push delay values of custom elements in older levels */
+ for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
+ {
+ int element = EL_CUSTOM_START + i;
+
+ if (element_info[element].push_delay_fixed == -1)
+ element_info[element].push_delay_fixed = game.default_push_delay_fixed;
+ if (element_info[element].push_delay_random == -1)
+ element_info[element].push_delay_random = game.default_push_delay_random;
}
#endif
}
InitFontGraphicInfo();
- DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW);
- DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED);
+ DrawInitText(getProgramInitString(), 20, FC_YELLOW);
+ DrawInitText(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
DrawInitText("Loading graphics:", 120, FC_GREEN);