#include "files.h"
#include "network.h"
#include "netserv.h"
-#include "cartoons.h"
+#include "anim.h"
#include "config.h"
#include "conf_e2g.c" /* include auto-generated data structure definitions */
};
+/* forward declaration for internal use */
+static int get_graphic_parameter_value(char *, char *, int);
+
+
void DrawInitAnim()
{
struct GraphicInfo *graphic_info_last = graphic_info;
int sync_frame = FrameCounter;
int x, y;
+ /* prevent OS (Windows) from complaining about program not responding */
+ CheckQuitEvent();
+
if (game_status != GAME_MODE_LOADING)
return;
if (!DelayReached(&action_delay, action_delay_value))
return;
+ if (init_last.busy.x == -1)
+ init_last.busy.x = WIN_XSIZE / 2;
+ if (init_last.busy.y == -1)
+ init_last.busy.y = WIN_YSIZE / 2;
+
x = ALIGNED_TEXT_XPOS(&init_last.busy);
y = ALIGNED_TEXT_YPOS(&init_last.busy);
gadgets_initialized = TRUE;
}
-inline void InitElementSmallImagesScaledUp(int graphic)
+inline static void InitElementSmallImagesScaledUp(int graphic)
{
struct GraphicInfo *g = &graphic_info[graphic];
static int special_graphics[] =
{
+ IMG_FLAMES_1_LEFT,
+ IMG_FLAMES_2_LEFT,
+ IMG_FLAMES_3_LEFT,
+ IMG_FLAMES_1_RIGHT,
+ IMG_FLAMES_2_RIGHT,
+ IMG_FLAMES_3_RIGHT,
+ IMG_FLAMES_1_UP,
+ IMG_FLAMES_2_UP,
+ IMG_FLAMES_3_UP,
+ IMG_FLAMES_1_DOWN,
+ IMG_FLAMES_2_DOWN,
+ IMG_FLAMES_3_DOWN,
IMG_EDITOR_ELEMENT_BORDER,
IMG_EDITOR_ELEMENT_BORDER_INPUT,
IMG_EDITOR_CASCADE_LIST,
print_timestamp_time("getImageListPropertyMapping/Size");
print_timestamp_init("InitElementSmallImagesScaledUp (1)");
- /* initialize normal images from static configuration */
+ /* initialize normal element images from static configuration */
for (i = 0; element_to_graphic[i].element > -1; i++)
InitElementSmallImagesScaledUp(element_to_graphic[i].graphic);
print_timestamp_done("InitElementSmallImagesScaledUp (1)");
- /* initialize special images from static configuration */
+ /* initialize special element images from static configuration */
for (i = 0; element_to_special_graphic[i].element > -1; i++)
InitElementSmallImagesScaledUp(element_to_special_graphic[i].graphic);
print_timestamp_time("InitElementSmallImagesScaledUp (2)");
- /* initialize images from dynamic configuration (may be elements or other) */
+ /* initialize element images from dynamic configuration */
for (i = 0; i < num_property_mappings; i++)
- InitElementSmallImagesScaledUp(property_mapping[i].artwork_index);
+ if (property_mapping[i].base_index < MAX_NUM_ELEMENTS)
+ InitElementSmallImagesScaledUp(property_mapping[i].artwork_index);
print_timestamp_time("InitElementSmallImagesScaledUp (3)");
- /* initialize special images from above list (non-element images) */
+ /* initialize special non-element images from above list */
for (i = 0; special_graphics[i] > -1; i++)
InitElementSmallImagesScaledUp(special_graphics[i]);
print_timestamp_time("InitElementSmallImagesScaledUp (4)");
print_timestamp_done("InitElementSmallImages");
}
+inline static void InitScaledImagesScaledUp(int graphic)
+{
+ struct GraphicInfo *g = &graphic_info[graphic];
+
+ ScaleImage(graphic, g->scale_up_factor);
+}
+
void InitScaledImages()
{
+ struct PropertyMapping *property_mapping = getImageListPropertyMapping();
+ int num_property_mappings = getImageListPropertyMappingSize();
int i;
/* scale normal images from static configuration, if not already scaled */
for (i = 0; i < NUM_IMAGE_FILES; i++)
- ScaleImage(i, graphic_info[i].scale_up_factor);
+ InitScaledImagesScaledUp(i);
+
+ /* scale images from dynamic configuration, if not already scaled */
+ for (i = 0; i < num_property_mappings; i++)
+ InitScaledImagesScaledUp(property_mapping[i].artwork_index);
}
void InitBitmapPointers()
graphic_info[i].bitmap = graphic_info[i].bitmaps[IMG_BITMAP_STANDARD];
}
+void InitImageTextures()
+{
+ int i, j, k;
+
+ FreeAllImageTextures();
+
+ for (i = IMG_GLOBAL_BORDER_FIRST; i <= IMG_GLOBAL_BORDER_LAST; i++)
+ CreateImageTextures(i);
+
+ for (i = 0; i < MAX_NUM_TOONS; i++)
+ CreateImageTextures(IMG_TOON_1 + i);
+
+ for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
+ {
+ for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+ {
+ for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+ {
+ int graphic = global_anim_info[i].graphic[j][k];
+
+ if (graphic == IMG_UNDEFINED)
+ continue;
+
+ CreateImageTextures(graphic);
+ }
+ }
+ }
+}
+
#if 1
/* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */
void SetBitmaps_EM(Bitmap **em_bitmap)
int special = property_mapping[i].ext3_index;
int graphic = property_mapping[i].artwork_index;
- if (font_nr < 0)
+ if (font_nr < 0 || font_nr >= NUM_FONTS)
continue;
if (IS_SPECIAL_GFX_ARG(special))
font_bitmap_info[font_bitmap_id].width = graphic_info[graphic].width;
font_bitmap_info[font_bitmap_id].height = graphic_info[graphic].height;
+ font_bitmap_info[font_bitmap_id].offset_x =
+ graphic_info[graphic].offset_x;
+ font_bitmap_info[font_bitmap_id].offset_y =
+ graphic_info[graphic].offset_y;
+
font_bitmap_info[font_bitmap_id].draw_xoffset =
graphic_info[graphic].draw_xoffset;
font_bitmap_info[font_bitmap_id].draw_yoffset =
getFontBitmapID, getFontFromToken);
}
+void InitGlobalAnimGraphicInfo()
+{
+ struct PropertyMapping *property_mapping = getImageListPropertyMapping();
+ int num_property_mappings = getImageListPropertyMappingSize();
+ int i, j, k;
+
+ if (graphic_info == NULL) /* still at startup phase */
+ return;
+
+ /* always start with reliable default values (no global animations) */
+ for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+ for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+ for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+ global_anim_info[i].graphic[j][k] = IMG_UNDEFINED;
+
+ /* initialize global animation definitions from static configuration */
+ for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+ {
+ int j = GLOBAL_ANIM_ID_PART_BASE;
+ int k = GFX_SPECIAL_ARG_DEFAULT;
+
+ global_anim_info[i].graphic[j][k] = IMG_GFX_GLOBAL_ANIM_1 + i;
+ }
+
+ /* initialize global animation definitions from dynamic configuration */
+ for (i = 0; i < num_property_mappings; i++)
+ {
+ int anim_nr = property_mapping[i].base_index - MAX_NUM_ELEMENTS - NUM_FONTS;
+ int part_nr = property_mapping[i].ext1_index - ACTION_PART_1;
+ int special = property_mapping[i].ext3_index;
+ int graphic = property_mapping[i].artwork_index;
+
+ if (anim_nr < 0 || anim_nr >= NUM_GLOBAL_ANIM_TOKENS)
+ continue;
+
+ /* set animation part to base part, if not specified */
+ if (!IS_GLOBAL_ANIM_PART(part_nr))
+ part_nr = GLOBAL_ANIM_ID_PART_BASE;
+
+ /* set animation screen to default, if not specified */
+ if (!IS_SPECIAL_GFX_ARG(special))
+ special = GFX_SPECIAL_ARG_DEFAULT;
+
+ global_anim_info[anim_nr].graphic[part_nr][special] = graphic;
+
+ /* fix default value for ".draw_masked" (for backward compatibility) */
+ struct GraphicInfo *g = &graphic_info[graphic];
+ struct FileInfo *image = getImageListEntryFromImageID(graphic);
+ char **parameter_raw = image->parameter;
+ int p = GFX_ARG_DRAW_MASKED;
+ int draw_masked = get_graphic_parameter_value(parameter_raw[p],
+ image_config_suffix[p].token,
+ image_config_suffix[p].type);
+
+ /* if ".draw_masked" parameter is undefined, use default value "TRUE" */
+ if (draw_masked == ARG_UNDEFINED_VALUE)
+ g->draw_masked = TRUE;
+ }
+
+#if 0
+ printf("::: InitGlobalAnimGraphicInfo\n");
+
+ for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
+ for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+ for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+ if (global_anim_info[i].graphic[j][k] != IMG_UNDEFINED &&
+ graphic_info[global_anim_info[i].graphic[j][k]].bitmap != NULL)
+ printf("::: - anim %d, part %d, mode %d => %d\n",
+ i, j, k, global_anim_info[i].graphic[j][k]);
+#endif
+}
+
+void InitGlobalAnimSoundInfo()
+{
+ struct PropertyMapping *property_mapping = getSoundListPropertyMapping();
+ int num_property_mappings = getSoundListPropertyMappingSize();
+ int i, j, k;
+
+ /* always start with reliable default values (no global animation sounds) */
+ for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+ for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+ for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+ global_anim_info[i].sound[j][k] = SND_UNDEFINED;
+
+ /* initialize global animation sound definitions from dynamic configuration */
+ for (i = 0; i < num_property_mappings; i++)
+ {
+ int anim_nr = property_mapping[i].base_index - 2 * MAX_NUM_ELEMENTS;
+ int part_nr = property_mapping[i].ext1_index - ACTION_PART_1;
+ int special = property_mapping[i].ext3_index;
+ int sound = property_mapping[i].artwork_index;
+
+ // sound uses control definition; map it to position of graphic (artwork)
+ anim_nr -= GLOBAL_ANIM_ID_CONTROL_FIRST;
+
+ if (anim_nr < 0 || anim_nr >= NUM_GLOBAL_ANIM_TOKENS)
+ continue;
+
+ /* set animation part to base part, if not specified */
+ if (!IS_GLOBAL_ANIM_PART(part_nr))
+ part_nr = GLOBAL_ANIM_ID_PART_BASE;
+
+ /* set animation screen to default, if not specified */
+ if (!IS_SPECIAL_GFX_ARG(special))
+ special = GFX_SPECIAL_ARG_DEFAULT;
+
+ global_anim_info[anim_nr].sound[part_nr][special] = sound;
+ }
+
+#if 0
+ printf("::: InitGlobalAnimSoundInfo\n");
+
+ for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
+ for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+ for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+ if (global_anim_info[i].sound[j][k] != SND_UNDEFINED)
+ printf("::: - anim %d, part %d, mode %d => %d\n",
+ i, j, k, global_anim_info[i].sound[j][k]);
+#endif
+}
+
+void InitGlobalAnimMusicInfo()
+{
+ struct PropertyMapping *property_mapping = getMusicListPropertyMapping();
+ int num_property_mappings = getMusicListPropertyMappingSize();
+ int i, j, k;
+
+ /* always start with reliable default values (no global animation music) */
+ for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+ for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+ for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+ global_anim_info[i].music[j][k] = MUS_UNDEFINED;
+
+ /* initialize global animation music definitions from dynamic configuration */
+ for (i = 0; i < num_property_mappings; i++)
+ {
+ int anim_nr = property_mapping[i].base_index - NUM_MUSIC_PREFIXES;
+ int part_nr = property_mapping[i].ext1_index - ACTION_PART_1;
+ int special = property_mapping[i].ext2_index;
+ int music = property_mapping[i].artwork_index;
+
+ // music uses control definition; map it to position of graphic (artwork)
+ anim_nr -= GLOBAL_ANIM_ID_CONTROL_FIRST;
+
+ if (anim_nr < 0 || anim_nr >= NUM_GLOBAL_ANIM_TOKENS)
+ continue;
+
+ /* set animation part to base part, if not specified */
+ if (!IS_GLOBAL_ANIM_PART(part_nr))
+ part_nr = GLOBAL_ANIM_ID_PART_BASE;
+
+ /* set animation screen to default, if not specified */
+ if (!IS_SPECIAL_GFX_ARG(special))
+ special = GFX_SPECIAL_ARG_DEFAULT;
+
+ global_anim_info[anim_nr].music[part_nr][special] = music;
+ }
+
+#if 0
+ printf("::: InitGlobalAnimMusicInfo\n");
+
+ for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
+ for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+ for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+ if (global_anim_info[i].music[j][k] != MUS_UNDEFINED)
+ printf("::: - anim %d, part %d, mode %d => %d\n",
+ i, j, k, global_anim_info[i].music[j][k]);
+#endif
+}
+
void InitElementGraphicInfo()
{
struct PropertyMapping *property_mapping = getImageListPropertyMapping();
(move_dir == MV_BIT_UP && !front_is_left_or_upper) ||
(move_dir == MV_BIT_RIGHT && front_is_left_or_upper) ||
(move_dir == MV_BIT_DOWN && front_is_left_or_upper)));
- Bitmap *dummy;
/* swap frontside and backside graphic tile coordinates, if needed */
if (swap_movement_tiles_always || swap_movement_tiles_autodetected)
{
/* get current (wrong) backside tile coordinates */
- getFixedGraphicSourceExt(graphic, 0, &dummy,
- &src_x_back, &src_y_back, TRUE);
+ getGraphicSourceXY(graphic, 0, &src_x_back, &src_y_back, TRUE);
/* set frontside tile coordinates to backside tile coordinates */
g->src_x = src_x_back;
default_action_graphic = element_info[EL_SP_DEFAULT].graphic[act];
if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].graphic[act] != -1)
default_action_graphic = element_info[EL_SB_DEFAULT].graphic[act];
+ if (IS_MM_ELEMENT(i) && element_info[EL_MM_DEFAULT].graphic[act] != -1)
+ default_action_graphic = element_info[EL_MM_DEFAULT].graphic[act];
if (IS_BD_ELEMENT(i) && element_info[EL_BD_DEFAULT].crumbled[act] != -1)
default_action_crumbled = element_info[EL_BD_DEFAULT].crumbled[act];
default_action_crumbled = element_info[EL_SP_DEFAULT].crumbled[act];
if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].crumbled[act] != -1)
default_action_crumbled = element_info[EL_SB_DEFAULT].crumbled[act];
+ if (IS_MM_ELEMENT(i) && element_info[EL_MM_DEFAULT].crumbled[act] != -1)
+ default_action_crumbled = element_info[EL_MM_DEFAULT].crumbled[act];
/* !!! needed because EL_EMPTY_SPACE treated as IS_SP_ELEMENT !!! */
/* !!! make this better !!! */
g->scale_up_factor = 1; /* default: no scaling up */
g->tile_size = TILESIZE; /* default: standard tile size */
g->clone_from = -1; /* do not use clone graphic */
+ g->init_delay_fixed = 0;
+ g->init_delay_random = 0;
g->anim_delay_fixed = 0;
g->anim_delay_random = 0;
g->post_delay_fixed = 0;
g->post_delay_random = 0;
+ g->init_event = ANIM_EVENT_DEFAULT;
+ g->anim_event = ANIM_EVENT_DEFAULT;
+ g->draw_masked = FALSE;
+ g->draw_order = 0;
g->fade_mode = FADE_MODE_DEFAULT;
g->fade_delay = -1;
g->post_delay = -1;
g->tile_size = TILESIZE; /* standard tile size */
#endif
-#if 0
- // CHECK: when setting tile size, should this set width and height?
+ // when setting tile size, also set width and height accordingly
g->width = g->tile_size;
g->height = g->tile_size;
-#endif
}
if (g->use_image_size)
if (parameter[GFX_ARG_TILE_SIZE] != ARG_UNDEFINED_VALUE)
{
- anim_frames_per_row = src_image_width / g->tile_size;
- anim_frames_per_col = src_image_height / g->tile_size;
+ anim_frames_per_row = MAX(1, src_image_width / g->tile_size);
+ anim_frames_per_col = MAX(1, src_image_height / g->tile_size);
}
else
{
- anim_frames_per_row = src_image_width / g->width;
- anim_frames_per_col = src_image_height / g->height;
+ anim_frames_per_row = MAX(1, src_image_width / g->width);
+ anim_frames_per_col = MAX(1, src_image_height / g->height);
}
g->src_image_width = src_image_width;
if (parameter[GFX_ARG_BORDER_SIZE] != ARG_UNDEFINED_VALUE)
g->border_size = parameter[GFX_ARG_BORDER_SIZE];
- /* this is only used for player "boring" and "sleeping" actions */
+ /* used for global animations and player "boring" and "sleeping" actions */
+ if (parameter[GFX_ARG_INIT_DELAY_FIXED] != ARG_UNDEFINED_VALUE)
+ g->init_delay_fixed = parameter[GFX_ARG_INIT_DELAY_FIXED];
+ if (parameter[GFX_ARG_INIT_DELAY_RANDOM] != ARG_UNDEFINED_VALUE)
+ g->init_delay_random = parameter[GFX_ARG_INIT_DELAY_RANDOM];
if (parameter[GFX_ARG_ANIM_DELAY_FIXED] != ARG_UNDEFINED_VALUE)
g->anim_delay_fixed = parameter[GFX_ARG_ANIM_DELAY_FIXED];
if (parameter[GFX_ARG_ANIM_DELAY_RANDOM] != ARG_UNDEFINED_VALUE)
if (parameter[GFX_ARG_POST_DELAY_RANDOM] != ARG_UNDEFINED_VALUE)
g->post_delay_random = parameter[GFX_ARG_POST_DELAY_RANDOM];
- /* this is only used for toon animations */
- g->step_offset = parameter[GFX_ARG_STEP_OFFSET];
- g->step_delay = parameter[GFX_ARG_STEP_DELAY];
+ /* used for global animations */
+ if (parameter[GFX_ARG_INIT_EVENT] != ARG_UNDEFINED_VALUE)
+ g->init_event = parameter[GFX_ARG_INIT_EVENT];
+ if (parameter[GFX_ARG_ANIM_EVENT] != ARG_UNDEFINED_VALUE)
+ g->anim_event = parameter[GFX_ARG_ANIM_EVENT];
+
+ /* used for toon animations and global animations */
+ g->step_offset = parameter[GFX_ARG_STEP_OFFSET];
+ g->step_xoffset = parameter[GFX_ARG_STEP_XOFFSET];
+ g->step_yoffset = parameter[GFX_ARG_STEP_YOFFSET];
+ g->step_delay = parameter[GFX_ARG_STEP_DELAY];
+ g->direction = parameter[GFX_ARG_DIRECTION];
+ g->position = parameter[GFX_ARG_POSITION];
+ g->x = parameter[GFX_ARG_X]; // (may be uninitialized,
+ g->y = parameter[GFX_ARG_Y]; // unlike src_x and src_y)
/* this is only used for drawing font characters */
g->draw_xoffset = parameter[GFX_ARG_DRAW_XOFFSET];
g->draw_yoffset = parameter[GFX_ARG_DRAW_YOFFSET];
- /* this is only used for drawing envelope graphics */
- g->draw_masked = parameter[GFX_ARG_DRAW_MASKED];
+ /* use a different default value for global animations and toons */
+ if ((graphic >= IMG_GFX_GLOBAL_ANIM_1 && graphic <= IMG_GFX_GLOBAL_ANIM_8) ||
+ (graphic >= IMG_TOON_1 && graphic <= IMG_TOON_20))
+ g->draw_masked = TRUE;
+
+ /* this is used for drawing envelopes, global animations and toons */
+ if (parameter[GFX_ARG_DRAW_MASKED] != ARG_UNDEFINED_VALUE)
+ g->draw_masked = parameter[GFX_ARG_DRAW_MASKED];
+
+ /* used for toon animations and global animations */
+ if (parameter[GFX_ARG_DRAW_ORDER] != ARG_UNDEFINED_VALUE)
+ g->draw_order = parameter[GFX_ARG_DRAW_ORDER];
/* optional graphic for cloning all graphics settings */
if (parameter[GFX_ARG_CLONE_FROM] != ARG_UNDEFINED_VALUE)
static int full_size_graphics[] =
{
IMG_GLOBAL_BORDER,
+ IMG_GLOBAL_BORDER_MAIN,
+ IMG_GLOBAL_BORDER_SCORES,
+ IMG_GLOBAL_BORDER_EDITOR,
+ IMG_GLOBAL_BORDER_PLAYING,
IMG_GLOBAL_DOOR,
IMG_BACKGROUND_ENVELOPE_1,
for (i = 0; i < num_images; i++)
{
- Bitmap *src_bitmap;
+ Bitmap *src_bitmap = graphic_info[i].bitmap;
int src_x, src_y;
int width, height;
- int first_frame, last_frame;
+ int last_frame;
int src_bitmap_width, src_bitmap_height;
/* now check if no animation frames are outside of the loaded image */
/* check if first animation frame is inside specified bitmap */
- first_frame = 0;
- getFixedGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y);
-
+ /* do not use getGraphicSourceXY() here to get position of first frame; */
/* this avoids calculating wrong start position for out-of-bounds frame */
src_x = graphic_info[i].src_x;
src_y = graphic_info[i].src_y;
+ if (program.headless)
+ continue;
+
if (src_x < 0 || src_y < 0 ||
src_x + width > src_bitmap_width ||
src_y + height > src_bitmap_height)
Error(ERR_INFO, "- config file: '%s'", getImageConfigFilename());
Error(ERR_INFO, "- config token: '%s'", getTokenFromImageID(i));
Error(ERR_INFO, "- image file: '%s'", src_bitmap->source_filename);
+ Error(ERR_INFO, "- frame size: %d, %d", width, height);
Error(ERR_INFO,
"error: first animation frame out of bounds (%d, %d) [%d, %d]",
src_x, src_y, src_bitmap_width, src_bitmap_height);
Error(ERR_INFO_LINE, "-");
graphic_info[i] = graphic_info[fallback_graphic];
+
+ /* if first frame out of bounds, do not check last frame anymore */
+ continue;
}
/* check if last animation frame is inside specified bitmap */
last_frame = graphic_info[i].anim_frames - 1;
- getFixedGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y);
+ getGraphicSourceXY(i, last_frame, &src_x, &src_y, FALSE);
if (src_x < 0 || src_y < 0 ||
src_x + width > src_bitmap_width ||
Error(ERR_INFO, "- config file: '%s'", getImageConfigFilename());
Error(ERR_INFO, "- config token: '%s'", getTokenFromImageID(i));
Error(ERR_INFO, "- image file: '%s'", src_bitmap->source_filename);
+ Error(ERR_INFO, "- frame size: %d, %d", width, height);
Error(ERR_INFO,
"error: last animation frame (%d) out of bounds (%d, %d) [%d, %d]",
last_frame, src_x, src_y, src_bitmap_width, src_bitmap_height);
- Error(ERR_INFO, "::: %d, %d", width, height);
Error(ERR_INFO, "custom graphic rejected for this element/action");
if (i == fallback_graphic)
{
// printf("::: special treatment needed for token '%s'\n", fi->token);
- graphic_info[i].bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
+ graphic_info[i].bitmaps = graphic_info[IMG_GLOBAL_DOOR].bitmaps;
+ graphic_info[i].bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
}
}
}
default_action_sound = element_info[EL_SP_DEFAULT].sound[act];
if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].sound[act] != -1)
default_action_sound = element_info[EL_SB_DEFAULT].sound[act];
+ if (IS_MM_ELEMENT(i) && element_info[EL_MM_DEFAULT].sound[act] != -1)
+ default_action_sound = element_info[EL_MM_DEFAULT].sound[act];
/* !!! needed because EL_EMPTY_SPACE treated as IS_SP_ELEMENT !!! */
/* !!! make this better !!! */
for (i = 0; i < num_property_mappings; i++)
{
int prefix = property_mapping[i].base_index;
- int gamemode = property_mapping[i].ext1_index;
- int level = property_mapping[i].ext2_index;
+ int gamemode = property_mapping[i].ext2_index;
+ int level = property_mapping[i].ext3_index;
int music = property_mapping[i].artwork_index;
if (prefix < 0 || prefix >= NUM_MUSIC_PREFIXES)
print_timestamp_time("InitBitmapPointers");
InitFontGraphicInfo(); /* initialize text drawing functions */
print_timestamp_time("InitFontGraphicInfo");
+ InitGlobalAnimGraphicInfo(); /* initialize global animation config */
+ print_timestamp_time("InitGlobalAnimGraphicInfo");
+
+ InitImageTextures(); /* create textures for certain images */
+ print_timestamp_time("InitImageTextures");
InitGraphicInfo_EM(); /* graphic mapping for EM engine */
print_timestamp_time("InitGraphicInfo_EM");
InitGadgets();
print_timestamp_time("InitGadgets");
- InitToons();
- print_timestamp_time("InitToons");
InitDoors();
print_timestamp_time("InitDoors");
InitSoundInfo(); /* sound properties mapping */
InitElementSoundInfo(); /* element game sound mapping */
InitGameModeSoundInfo(); /* game mode sound mapping */
+ InitGlobalAnimSoundInfo(); /* global animation sound settings */
InitPlayLevelSound(); /* internal game sound settings */
}
{
InitMusicInfo(); /* music properties mapping */
InitGameModeMusicInfo(); /* game mode music mapping */
+ InitGlobalAnimMusicInfo(); /* global animation music settings */
}
static int get_special_property_bit(int element, int property_bit_nr)
EL_INTERNAL_CASCADE_SP_ACTIVE,
EL_INTERNAL_CASCADE_DC_ACTIVE,
EL_INTERNAL_CASCADE_DX_ACTIVE,
+ EL_INTERNAL_CASCADE_MM_ACTIVE,
+ EL_INTERNAL_CASCADE_DF_ACTIVE,
EL_INTERNAL_CASCADE_CHARS_ACTIVE,
EL_INTERNAL_CASCADE_STEEL_CHARS_ACTIVE,
EL_INTERNAL_CASCADE_CE_ACTIVE,
EL_INTERNAL_CASCADE_SP,
EL_INTERNAL_CASCADE_DC,
EL_INTERNAL_CASCADE_DX,
+ EL_INTERNAL_CASCADE_MM,
+ EL_INTERNAL_CASCADE_DF,
EL_INTERNAL_CASCADE_CHARS,
EL_INTERNAL_CASCADE_STEEL_CHARS,
EL_INTERNAL_CASCADE_CE,
InitElementGraphicInfo();
}
-void InitElementPropertiesAfterLoading(int engine_version)
-{
- int i;
-
- /* set some other uninitialized values of custom elements in older levels */
- if (engine_version < VERSION_IDENT(3,1,0,0))
- {
- for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++)
- {
- int element = EL_CUSTOM_START + i;
-
- element_info[element].access_direction = MV_ALL_DIRECTIONS;
-
- element_info[element].explosion_delay = 17;
- element_info[element].ignition_delay = 8;
- }
- }
-}
-
void InitElementPropertiesGfxElement()
{
int i;
element_info[i].editor_description= element_name_info[i].editor_description;
}
+ for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS + 1; i++)
+ {
+ /* check if global_anim_name_info defined for each entry in "main.h" */
+ if (i < NUM_GLOBAL_ANIM_TOKENS &&
+ global_anim_name_info[i].token_name == NULL)
+ Error(ERR_EXIT, "undefined 'global_anim_name_info' entry for anim %d", i);
+
+ global_anim_info[i].token_name = global_anim_name_info[i].token_name;
+ }
+
/* create hash from image config list */
image_config_hash = newSetupFileHash();
for (i = 0; image_config[i].token != NULL; i++)
global.create_images_dir = NULL;
global.frames_per_second = 0;
- global.fps_slowdown = FALSE;
- global.fps_slowdown_factor = 1;
+ global.show_frames_per_second = FALSE;
- global.border_status = GAME_MODE_MAIN;
+ global.border_status = GAME_MODE_LOADING;
+ global.anim_status = global.anim_status_next = GAME_MODE_LOADING;
global.use_envelope_request = FALSE;
}
if (strEqual(command, "print graphicsinfo.conf"))
{
- printf("# You can configure additional/alternative image files here.\n");
- printf("# (The entries below are default and therefore commented out.)\n");
- printf("\n");
- printf("%s\n", getFormattedSetupEntry("name", "Classic Graphics"));
- printf("\n");
- printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
- printf("\n");
+ Print("# You can configure additional/alternative image files here.\n");
+ Print("# (The entries below are default and therefore commented out.)\n");
+ Print("\n");
+ Print("%s\n", getFormattedSetupEntry("name", "Classic Graphics"));
+ Print("\n");
+ Print("%s\n", getFormattedSetupEntry("sort_priority", "100"));
+ Print("\n");
for (i = 0; image_config[i].token != NULL; i++)
- printf("# %s\n", getFormattedSetupEntry(image_config[i].token,
- image_config[i].value));
+ Print("# %s\n", getFormattedSetupEntry(image_config[i].token,
+ image_config[i].value));
exit(0);
}
else if (strEqual(command, "print soundsinfo.conf"))
{
- printf("# You can configure additional/alternative sound files here.\n");
- printf("# (The entries below are default and therefore commented out.)\n");
- printf("\n");
- printf("%s\n", getFormattedSetupEntry("name", "Classic Sounds"));
- printf("\n");
- printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
- printf("\n");
+ Print("# You can configure additional/alternative sound files here.\n");
+ Print("# (The entries below are default and therefore commented out.)\n");
+ Print("\n");
+ Print("%s\n", getFormattedSetupEntry("name", "Classic Sounds"));
+ Print("\n");
+ Print("%s\n", getFormattedSetupEntry("sort_priority", "100"));
+ Print("\n");
for (i = 0; sound_config[i].token != NULL; i++)
- printf("# %s\n", getFormattedSetupEntry(sound_config[i].token,
- sound_config[i].value));
+ Print("# %s\n", getFormattedSetupEntry(sound_config[i].token,
+ sound_config[i].value));
exit(0);
}
else if (strEqual(command, "print musicinfo.conf"))
{
- printf("# You can configure additional/alternative music files here.\n");
- printf("# (The entries below are default and therefore commented out.)\n");
- printf("\n");
- printf("%s\n", getFormattedSetupEntry("name", "Classic Music"));
- printf("\n");
- printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
- printf("\n");
+ Print("# You can configure additional/alternative music files here.\n");
+ Print("# (The entries below are default and therefore commented out.)\n");
+ Print("\n");
+ Print("%s\n", getFormattedSetupEntry("name", "Classic Music"));
+ Print("\n");
+ Print("%s\n", getFormattedSetupEntry("sort_priority", "100"));
+ Print("\n");
for (i = 0; music_config[i].token != NULL; i++)
- printf("# %s\n", getFormattedSetupEntry(music_config[i].token,
- music_config[i].value));
+ Print("# %s\n", getFormattedSetupEntry(music_config[i].token,
+ music_config[i].value));
exit(0);
}
else if (strEqual(command, "print editorsetup.conf"))
{
- printf("# You can configure your personal editor element list here.\n");
- printf("# (The entries below are default and therefore commented out.)\n");
- printf("\n");
+ Print("# You can configure your personal editor element list here.\n");
+ Print("# (The entries below are default and therefore commented out.)\n");
+ Print("\n");
/* this is needed to be able to check element list for cascade elements */
InitElementPropertiesStatic();
}
else if (strEqual(command, "print helpanim.conf"))
{
- printf("# You can configure different element help animations here.\n");
- printf("# (The entries below are default and therefore commented out.)\n");
- printf("\n");
+ Print("# You can configure different element help animations here.\n");
+ Print("# (The entries below are default and therefore commented out.)\n");
+ Print("\n");
for (i = 0; helpanim_config[i].token != NULL; i++)
{
- printf("# %s\n", getFormattedSetupEntry(helpanim_config[i].token,
- helpanim_config[i].value));
+ Print("# %s\n", getFormattedSetupEntry(helpanim_config[i].token,
+ helpanim_config[i].value));
if (strEqual(helpanim_config[i].token, "end"))
- printf("#\n");
+ Print("#\n");
}
exit(0);
}
else if (strEqual(command, "print helptext.conf"))
{
- printf("# You can configure different element help text here.\n");
- printf("# (The entries below are default and therefore commented out.)\n");
- printf("\n");
+ Print("# You can configure different element help text here.\n");
+ Print("# (The entries below are default and therefore commented out.)\n");
+ Print("\n");
for (i = 0; helptext_config[i].token != NULL; i++)
- printf("# %s\n", getFormattedSetupEntry(helptext_config[i].token,
- helptext_config[i].value));
+ Print("# %s\n", getFormattedSetupEntry(helptext_config[i].token,
+ helptext_config[i].value));
exit(0);
}
exit(0);
}
- else if (strPrefix(command, "autoplay "))
+ else if (strPrefix(command, "autotest ") ||
+ strPrefix(command, "autoplay ") ||
+ strPrefix(command, "autoffwd ") ||
+ strPrefix(command, "autowarp "))
{
char *str_ptr = getStringCopy(&command[9]); /* read command parameters */
+ global.autoplay_mode =
+ (strPrefix(command, "autotest") ? AUTOPLAY_MODE_TEST :
+ strPrefix(command, "autoplay") ? AUTOPLAY_MODE_PLAY :
+ strPrefix(command, "autoffwd") ? AUTOPLAY_MODE_FFWD :
+ strPrefix(command, "autowarp") ? AUTOPLAY_MODE_WARP :
+ AUTOPLAY_MODE_NONE);
+
while (*str_ptr != '\0') /* continue parsing string */
{
/* cut leading whitespace from string, replace it by string terminator */
while (*str_ptr != ' ' && *str_ptr != '\t' && *str_ptr != '\0')
str_ptr++;
}
+
+ if (global.autoplay_mode == AUTOPLAY_MODE_TEST)
+ program.headless = TRUE;
}
else if (strPrefix(command, "convert "))
{
*str_ptr++ = '\0'; /* terminate leveldir string */
global.convert_level_nr = atoi(str_ptr); /* get level_nr value */
}
+
+ program.headless = TRUE;
}
else if (strPrefix(command, "create images "))
{
exit(0);
}
-
-#if DEBUG
-#if defined(TARGET_SDL2)
- else if (strEqual(command, "SDL_ListModes"))
- {
- SDL_Init(SDL_INIT_VIDEO);
-
- int num_displays = SDL_GetNumVideoDisplays();
-
- // check if there are any displays available
- if (num_displays < 0)
- {
- printf("No displays available: %s\n", SDL_GetError());
-
- exit(-1);
- }
-
- for (i = 0; i < num_displays; i++)
- {
- int num_modes = SDL_GetNumDisplayModes(i);
- int j;
-
- printf("Available display modes for display %d:\n", i);
-
- // check if there are any display modes available for this display
- if (num_modes < 0)
- {
- printf("No display modes available for display %d: %s\n",
- i, SDL_GetError());
-
- exit(-1);
- }
-
- for (j = 0; j < num_modes; j++)
- {
- SDL_DisplayMode mode;
-
- if (SDL_GetDisplayMode(i, j, &mode) < 0)
- {
- printf("Cannot get display mode %d for display %d: %s\n",
- j, i, SDL_GetError());
-
- exit(-1);
- }
-
- printf("- %d x %d\n", mode.w, mode.h);
- }
- }
-
- exit(0);
- }
-#elif defined(TARGET_SDL)
- else if (strEqual(command, "SDL_ListModes"))
- {
- SDL_Rect **modes;
- int i;
-
- SDL_Init(SDL_INIT_VIDEO);
-
- /* get available fullscreen/hardware modes */
- modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
-
- /* check if there are any modes available */
- if (modes == NULL)
- {
- printf("No modes available!\n");
-
- exit(-1);
- }
-
- /* check if our resolution is restricted */
- if (modes == (SDL_Rect **)-1)
- {
- printf("All resolutions available.\n");
- }
- else
- {
- printf("Available display modes:\n");
-
- for (i = 0; modes[i]; i++)
- printf("- %d x %d\n", modes[i]->w, modes[i]->h);
- }
-
- exit(0);
- }
-#endif
-#endif
-
else
{
Error(ERR_EXIT_HELP, "unrecognized command '%s'", command);
static void InitSetup()
{
LoadSetup(); /* global setup info */
+ LoadSetup_AutoSetup(); /* global auto setup info */
/* set some options from setup file */
if (setup.options.verbose)
options.verbose = TRUE;
+
+ if (setup.debug.show_frames_per_second)
+ global.show_frames_per_second = TRUE;
}
static void InitGameInfo()
static void InitArtworkConfig()
{
- static char *image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + 1];
- static char *sound_id_prefix[2 * MAX_NUM_ELEMENTS + 1];
- static char *music_id_prefix[NUM_MUSIC_PREFIXES + 1];
+ static char *image_id_prefix[MAX_NUM_ELEMENTS +
+ NUM_FONTS +
+ NUM_GLOBAL_ANIM_TOKENS + 1];
+ static char *sound_id_prefix[2 * MAX_NUM_ELEMENTS +
+ NUM_GLOBAL_ANIM_TOKENS + 1];
+ static char *music_id_prefix[NUM_MUSIC_PREFIXES +
+ NUM_GLOBAL_ANIM_TOKENS + 1];
static char *action_id_suffix[NUM_ACTIONS + 1];
static char *direction_id_suffix[NUM_DIRECTIONS_FULL + 1];
static char *special_id_suffix[NUM_SPECIAL_GFX_ARGS + 1];
{
"name",
"sort_priority",
+ "program_title",
+ "program_copyright",
+ "program_company",
+
NULL
};
static char **ignore_image_tokens;
image_id_prefix[i] = element_info[i].token_name;
for (i = 0; i < NUM_FONTS; i++)
image_id_prefix[MAX_NUM_ELEMENTS + i] = font_info[i].token_name;
- image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS] = NULL;
+ for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+ image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + i] =
+ global_anim_info[i].token_name;
+ image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + NUM_GLOBAL_ANIM_TOKENS] = NULL;
for (i = 0; i < MAX_NUM_ELEMENTS; i++)
sound_id_prefix[i] = element_info[i].token_name;
for (i = 0; i < MAX_NUM_ELEMENTS; i++)
sound_id_prefix[MAX_NUM_ELEMENTS + i] =
get_string_in_brackets(element_info[i].class_name);
- sound_id_prefix[2 * MAX_NUM_ELEMENTS] = NULL;
+ for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+ sound_id_prefix[2 * MAX_NUM_ELEMENTS + i] =
+ global_anim_info[i].token_name;
+ sound_id_prefix[2 * MAX_NUM_ELEMENTS + NUM_GLOBAL_ANIM_TOKENS] = NULL;
for (i = 0; i < NUM_MUSIC_PREFIXES; i++)
music_id_prefix[i] = music_prefix_info[i].prefix;
- music_id_prefix[NUM_MUSIC_PREFIXES] = NULL;
+ for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+ music_id_prefix[NUM_MUSIC_PREFIXES + i] =
+ global_anim_info[i].token_name;
+ music_id_prefix[NUM_MUSIC_PREFIXES + NUM_GLOBAL_ANIM_TOKENS] = NULL;
for (i = 0; i < NUM_ACTIONS; i++)
action_id_suffix[i] = element_action_info[i].suffix;
sound_id_prefix, action_id_suffix, dummy,
special_id_suffix, ignore_sound_tokens);
InitMusicList(music_config, NUM_MUSIC_FILES, music_config_suffix,
- music_id_prefix, special_id_suffix, level_id_suffix,
- dummy, ignore_music_tokens);
+ music_id_prefix, action_id_suffix, special_id_suffix,
+ level_id_suffix, ignore_music_tokens);
}
static void InitMixer()
void InitGfxBuffers()
{
+ static int win_xsize_last = -1;
+ static int win_ysize_last = -1;
+
/* create additional image buffers for double-buffering and cross-fading */
- ReCreateBitmap(&bitmap_db_store, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
- ReCreateBitmap(&bitmap_db_cross, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
- ReCreateBitmap(&bitmap_db_field, FXSIZE, FYSIZE, DEFAULT_DEPTH);
- ReCreateBitmap(&bitmap_db_panel, DXSIZE, DYSIZE, DEFAULT_DEPTH);
- ReCreateBitmap(&bitmap_db_door_1, 3 * DXSIZE, DYSIZE, DEFAULT_DEPTH);
- ReCreateBitmap(&bitmap_db_door_2, 3 * VXSIZE, VYSIZE, DEFAULT_DEPTH);
- ReCreateBitmap(&bitmap_db_toons, FULL_SXSIZE, FULL_SYSIZE, DEFAULT_DEPTH);
+
+ if (WIN_XSIZE != win_xsize_last || WIN_YSIZE != win_ysize_last)
+ {
+ /* used to temporarily store the backbuffer -- only re-create if changed */
+ ReCreateBitmap(&bitmap_db_store_1, WIN_XSIZE, WIN_YSIZE);
+ ReCreateBitmap(&bitmap_db_store_2, WIN_XSIZE, WIN_YSIZE);
+
+ win_xsize_last = WIN_XSIZE;
+ win_ysize_last = WIN_YSIZE;
+ }
+
+ ReCreateBitmap(&bitmap_db_field, FXSIZE, FYSIZE);
+ ReCreateBitmap(&bitmap_db_panel, DXSIZE, DYSIZE);
+ ReCreateBitmap(&bitmap_db_door_1, 3 * DXSIZE, DYSIZE);
+ ReCreateBitmap(&bitmap_db_door_2, 3 * VXSIZE, VYSIZE);
/* initialize screen properties */
InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE,
font_height = getFontHeight(FC_RED);
DrawInitText(getProgramInitString(), 20, FC_YELLOW);
- DrawInitText(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
- DrawInitText(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height, FC_RED);
+ DrawInitText(setup.internal.program_copyright, 50, FC_RED);
+ DrawInitText(setup.internal.program_website, WIN_YSIZE - 20 - font_height,
+ FC_RED);
DrawInitText("Loading graphics", 120, FC_GREEN);
- /* initialize busy animation with default values */
+ /* initialize settings for busy animation with default values */
int parameter[NUM_GFX_ARGS];
for (i = 0; i < NUM_GFX_ARGS; i++)
parameter[i] = get_graphic_parameter_value(image_config_suffix[i].value,
image_config_suffix[i].token,
image_config_suffix[i].type);
- /* determine settings for busy animation (when displaying startup messages) */
- for (i = 0; image_config[i].token != NULL; i++)
+ char *anim_token = CONFIG_TOKEN_GLOBAL_BUSY;
+ int len_anim_token = strlen(anim_token);
+
+ /* read settings for busy animation from default custom artwork config */
+ char *gfx_config_filename = getPath3(options.graphics_directory,
+ GFX_DEFAULT_SUBDIR,
+ GRAPHICSINFO_FILENAME);
+
+ if (fileExists(gfx_config_filename))
{
- char *anim_token = CONFIG_TOKEN_GLOBAL_BUSY;
- int len_anim_token = strlen(anim_token);
+ SetupFileHash *setup_file_hash = loadSetupFileHash(gfx_config_filename);
- if (strEqual(image_config[i].token, anim_token))
- filename_anim_initial = image_config[i].value;
- else if (strlen(image_config[i].token) > len_anim_token &&
- strncmp(image_config[i].token, anim_token, len_anim_token) == 0)
+ if (setup_file_hash)
{
- for (j = 0; image_config_suffix[j].token != NULL; j++)
+ char *filename = getHashEntry(setup_file_hash, anim_token);
+
+ if (filename)
{
- if (strEqual(&image_config[i].token[len_anim_token],
- image_config_suffix[j].token))
- parameter[j] =
- get_graphic_parameter_value(image_config[i].value,
- image_config_suffix[j].token,
- image_config_suffix[j].type);
+ filename_anim_initial = getStringCopy(filename);
+
+ for (j = 0; image_config_suffix[j].token != NULL; j++)
+ {
+ int type = image_config_suffix[j].type;
+ char *suffix = image_config_suffix[j].token;
+ char *token = getStringCat2(anim_token, suffix);
+ char *value = getHashEntry(setup_file_hash, token);
+
+ checked_free(token);
+
+ if (value)
+ parameter[j] = get_graphic_parameter_value(value, suffix, type);
+ }
}
+
+ freeSetupFileHash(setup_file_hash);
}
}
-#if defined(CREATE_SPECIAL_EDITION_RND_JUE)
- filename_anim_initial = "loading.pcx";
-
- parameter[GFX_ARG_X] = 0;
- parameter[GFX_ARG_Y] = 0;
- parameter[GFX_ARG_WIDTH] = 128;
- parameter[GFX_ARG_HEIGHT] = 40;
- parameter[GFX_ARG_FRAMES] = 32;
- parameter[GFX_ARG_DELAY] = 4;
- parameter[GFX_ARG_FRAMES_PER_LINE] = ARG_UNDEFINED_VALUE;
-#endif
+ if (filename_anim_initial == NULL)
+ {
+ /* read settings for busy animation from static default artwork config */
+ for (i = 0; image_config[i].token != NULL; i++)
+ {
+ if (strEqual(image_config[i].token, anim_token))
+ filename_anim_initial = getStringCopy(image_config[i].value);
+ else if (strlen(image_config[i].token) > len_anim_token &&
+ strncmp(image_config[i].token, anim_token, len_anim_token) == 0)
+ {
+ for (j = 0; image_config_suffix[j].token != NULL; j++)
+ {
+ if (strEqual(&image_config[i].token[len_anim_token],
+ image_config_suffix[j].token))
+ parameter[j] =
+ get_graphic_parameter_value(image_config[i].value,
+ image_config_suffix[j].token,
+ image_config_suffix[j].type);
+ }
+ }
+ }
+ }
if (filename_anim_initial == NULL) /* should not happen */
Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_GLOBAL_BUSY);
anim_initial.bitmaps[IMG_BITMAP_STANDARD] =
LoadCustomImage(filename_anim_initial);
+ checked_free(filename_anim_initial);
+
graphic_info = &anim_initial; /* graphic == 0 => anim_initial */
set_graphic_parameters_ext(0, parameter, anim_initial.bitmaps);
init.busy.height = anim_initial.height;
InitMenuDesignSettings_Static();
+
InitGfxDrawBusyAnimFunction(DrawInitAnim);
+ InitGfxDrawGlobalAnimFunction(DrawGlobalAnimations);
+ InitGfxDrawGlobalBorderFunction(DrawMaskedBorderToTarget);
+ InitGfxDrawTileCursorFunction(DrawTileCursor);
+
+ gfx.fade_border_source_status = global.border_status;
+ gfx.fade_border_target_status = global.border_status;
+ gfx.masked_border_bitmap_ptr = backbuffer;
/* use copy of busy animation to prevent change while reloading artwork */
init_last = init;
}
-void RedrawBackground()
-{
- BlitBitmap(graphic_info[IMG_GLOBAL_BORDER].bitmap, backbuffer,
- 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
-
- redraw_mask = REDRAW_ALL;
-}
-
void InitGfxBackground()
{
- int x, y;
-
fieldbuffer = bitmap_db_field;
- SetDrawtoField(DRAW_BACKBUFFER);
+ SetDrawtoField(DRAW_TO_BACKBUFFER);
ClearRectangle(backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE);
- for (x = 0; x < MAX_BUF_XSIZE; x++)
- for (y = 0; y < MAX_BUF_YSIZE; y++)
- redraw[x][y] = 0;
- redraw_tiles = 0;
redraw_mask = REDRAW_ALL;
}
LoadLevelInfo(); /* global level info */
LoadLevelSetup_LastSeries(); /* last played series info */
LoadLevelSetup_SeriesInfo(); /* last played level info */
+
+ if (global.autoplay_leveldir &&
+ global.autoplay_mode != AUTOPLAY_MODE_TEST)
+ {
+ leveldir_current = getTreeInfoFromIdentifier(leveldir_first,
+ global.autoplay_leveldir);
+ if (leveldir_current == NULL)
+ leveldir_current = getFirstValidTreeInfoEntry(leveldir_first);
+ }
}
static void InitLevelArtworkInfo()
ReinitializeGraphics();
print_timestamp_time("ReinitializeGraphics");
+ LoadMenuDesignSettings_AfterGraphics();
+ print_timestamp_time("LoadMenuDesignSettings_AfterGraphics");
+
UPDATE_BUSY_STATE();
print_timestamp_done("InitImages");
print_timestamp_done("InitMusic");
}
+static void InitArtworkDone()
+{
+ if (program.headless)
+ return;
+
+ InitGlobalAnimations();
+}
+
void InitNetworkServer()
{
#if defined(NETWORK_AVALIABLE)
print_timestamp_init("ReloadCustomArtwork");
- game_status = GAME_MODE_LOADING;
+ SetGameStatus(GAME_MODE_LOADING);
FadeOut(REDRAW_ALL);
print_timestamp_time("InitMusic");
}
- game_status = last_game_status; /* restore current game status */
+ InitArtworkDone();
+
+ SetGameStatus(last_game_status); /* restore current game status */
init_last = init; /* switch to new busy animation */
FadeOut(REDRAW_ALL);
- RedrawBackground();
+ RedrawGlobalBorder();
/* force redraw of (open or closed) door graphics */
SetDoorState(DOOR_OPEN_ALL);
void DisplayExitMessage(char *format, va_list ap)
{
+ // also check for initialized video (headless flag may be temporarily unset)
+ if (program.headless || !video.initialized)
+ return;
+
// check if draw buffer and fonts for exit message are already available
if (drawto == NULL || font_initial[NUM_INITIAL_FONTS - 1].bitmap == NULL)
return;
sy += 3 * font_height;
num_lines_printed =
- DrawTextBuffer(sx, sy, program.error_filename, font_2,
+ DrawTextBuffer(sx, sy, program.log_filename[LOG_ERR_ID], font_2,
line_length, line_length, max_lines,
0, BLIT_ON_BACKGROUND, TRUE, TRUE, FALSE);
{
print_timestamp_init("OpenAll");
- game_status = GAME_MODE_LOADING;
+ SetGameStatus(GAME_MODE_LOADING);
InitCounter();
print_timestamp_time("[init global stuff]");
+ InitSetup();
+
+ print_timestamp_time("[init setup/config stuff (1)]");
+
+ InitScoresInfo();
+
if (options.execute_command)
Execute_Command(options.execute_command);
exit(0); /* never reached, server loops forever */
}
- InitSetup();
-
- print_timestamp_time("[init setup/config stuff (1)]");
-
InitGameInfo();
print_timestamp_time("[init setup/config stuff (2)]");
InitPlayerInfo();
print_timestamp_time("[init setup/config stuff]");
+ InitVideoDefaults();
InitVideoDisplay();
InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen);
- InitEventFilter(FilterEvents);
+ InitTileCursorInfo();
+ InitOverlayInfo();
print_timestamp_time("[init video stuff]");
InitMusic(NULL); /* needs to know current level directory */
print_timestamp_time("InitMusic");
+ InitArtworkDone();
+
InitGfxBackground();
em_open_all();
sp_open_all();
+ mm_open_all();
if (global.autoplay_leveldir)
{
return;
}
- game_status = GAME_MODE_MAIN;
+ SetGameStatus(GAME_MODE_MAIN);
FadeSetEnterScreen();
if (!(fading.fade_mode & FADE_TYPE_TRANSFORM))
Error(ERR_DEBUG, "::: SDL_AndroidGetExternalStoragePath() == '%s'",
SDL_AndroidGetExternalStoragePath());
Error(ERR_DEBUG, "::: SDL_AndroidGetExternalStorageState() == '%s'",
- (SDL_AndroidGetExternalStorageState() ==
- SDL_ANDROID_EXTERNAL_STORAGE_READ ? "read" :
- SDL_AndroidGetExternalStorageState() ==
- SDL_ANDROID_EXTERNAL_STORAGE_WRITE ? "write" : "not available"));
+ (SDL_AndroidGetExternalStorageState() &
+ SDL_ANDROID_EXTERNAL_STORAGE_WRITE ? "writable" :
+ SDL_AndroidGetExternalStorageState() &
+ SDL_ANDROID_EXTERNAL_STORAGE_READ ? "readable" : "not available"));
#endif
#endif
}
CloseVideoDisplay();
ClosePlatformDependentStuff();
- if (exit_value != 0)
+ if (exit_value != 0 && !options.execute_command)
{
/* fall back to default level set (current set may have caused an error) */
SaveLevelSetup_LastSeries_Deactivate();