inline void InitElementSmallImagesScaledUp(int graphic)
{
- CreateImageWithSmallImages(graphic, graphic_info[graphic].scale_up_factor,
- graphic_info[graphic].tile_size);
+ struct GraphicInfo *g = &graphic_info[graphic];
+
+ // create small and game tile sized bitmaps (and scale up, if needed)
+ CreateImageWithSmallImages(graphic, g->scale_up_factor, g->tile_size);
}
void InitElementSmallImages()
ScaleImage(i, graphic_info[i].scale_up_factor);
}
+void InitBitmapPointers()
+{
+ int num_images = getImageListSize();
+ int i;
+
+ // standard size bitmap may have changed -- update default bitmap pointer
+ for (i = 0; i < num_images; i++)
+ if (graphic_info[i].bitmaps)
+ graphic_info[i].bitmap = graphic_info[i].bitmaps[IMG_BITMAP_STANDARD];
+}
+
#if 1
/* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */
void SetBitmaps_EM(Bitmap **em_bitmap)
{
char *value = getHashEntry(element_token_hash, value_raw);
+ if (value == NULL)
+ {
+ Error(ERR_INFO_LINE, "-");
+ Error(ERR_INFO, "warning: error found in config file:");
+ Error(ERR_INFO, "- config file: '%s'", getImageConfigFilename());
+ Error(ERR_INFO, "error: invalid element token '%s'", value_raw);
+ Error(ERR_INFO, "custom graphic rejected for this element/action");
+ Error(ERR_INFO, "fallback done to undefined element for this graphic");
+ Error(ERR_INFO_LINE, "-");
+ }
+
return (value != NULL ? atoi(value) : EL_UNDEFINED);
}
else if (type == TYPE_GRAPHIC)
{
char *value = getHashEntry(graphic_token_hash, value_raw);
+ int fallback_graphic = IMG_CHAR_EXCLAM;
- return (value != NULL ? atoi(value) : IMG_UNDEFINED);
+ if (value == NULL)
+ {
+ Error(ERR_INFO_LINE, "-");
+ Error(ERR_INFO, "warning: error found in config file:");
+ Error(ERR_INFO, "- config file: '%s'", getImageConfigFilename());
+ Error(ERR_INFO, "error: invalid graphic token '%s'", value_raw);
+ Error(ERR_INFO, "custom graphic rejected for this element/action");
+ Error(ERR_INFO, "fallback done to 'char_exclam' for this graphic");
+ Error(ERR_INFO_LINE, "-");
+ }
+
+ return (value != NULL ? atoi(value) : fallback_graphic);
}
return -1;
}
static void set_graphic_parameters_ext(int graphic, int *parameter,
- Bitmap *src_bitmap)
+ Bitmap **src_bitmaps)
{
struct GraphicInfo *g = &graphic_info[graphic];
+ Bitmap *src_bitmap = (src_bitmaps ? src_bitmaps[IMG_BITMAP_STANDARD] : NULL);
int anim_frames_per_row = 1, anim_frames_per_col = 1;
int anim_frames_per_line = 1;
g->class = 0;
g->style = STYLE_DEFAULT;
+ g->bitmaps = src_bitmaps;
g->bitmap = src_bitmap;
/* optional zoom factor for scaling up the image to a larger size */
/* optional tile size for using non-standard image size */
if (parameter[GFX_ARG_TILE_SIZE] != ARG_UNDEFINED_VALUE)
+ {
g->tile_size = parameter[GFX_ARG_TILE_SIZE];
- if (g->tile_size < TILESIZE)
- g->tile_size = TILESIZE; /* standard tile size */
+
+#if 0
+ // CHECK: should tile sizes less than standard tile size be allowed?
+ if (g->tile_size < TILESIZE)
+ g->tile_size = TILESIZE; /* standard tile size */
+#endif
+
+#if 0
+ // CHECK: when setting tile size, should this set width and height?
+ g->width = g->tile_size;
+ g->height = g->tile_size;
+#endif
+ }
if (g->use_image_size)
{
g->height = get_scaled_graphic_height(graphic);
}
+ /* optional width and height of each animation frame */
+ if (parameter[GFX_ARG_WIDTH] != ARG_UNDEFINED_VALUE)
+ g->width = parameter[GFX_ARG_WIDTH];
+ if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE)
+ g->height = parameter[GFX_ARG_HEIGHT];
+
/* optional x and y tile position of animation frame sequence */
if (parameter[GFX_ARG_XPOS] != ARG_UNDEFINED_VALUE)
- g->src_x = parameter[GFX_ARG_XPOS] * TILEX;
+ g->src_x = parameter[GFX_ARG_XPOS] * g->width;
if (parameter[GFX_ARG_YPOS] != ARG_UNDEFINED_VALUE)
- g->src_y = parameter[GFX_ARG_YPOS] * TILEY;
+ g->src_y = parameter[GFX_ARG_YPOS] * g->height;
/* optional x and y pixel position of animation frame sequence */
if (parameter[GFX_ARG_X] != ARG_UNDEFINED_VALUE)
if (parameter[GFX_ARG_Y] != ARG_UNDEFINED_VALUE)
g->src_y = parameter[GFX_ARG_Y];
- /* optional width and height of each animation frame */
- if (parameter[GFX_ARG_WIDTH] != ARG_UNDEFINED_VALUE)
- g->width = parameter[GFX_ARG_WIDTH];
- if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE)
- g->height = parameter[GFX_ARG_HEIGHT];
-
if (src_bitmap)
{
if (g->width <= 0)
src_image_height = src_bitmap->height;
}
- anim_frames_per_row = src_image_width / g->width;
- anim_frames_per_col = src_image_height / g->height;
+ 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;
+ }
+ else
+ {
+ anim_frames_per_row = src_image_width / g->width;
+ anim_frames_per_col = src_image_height / g->height;
+ }
g->src_image_width = src_image_width;
g->src_image_height = src_image_height;
{
struct FileInfo *image = getImageListEntryFromImageID(graphic);
char **parameter_raw = image->parameter;
- Bitmap *src_bitmap = getBitmapFromImageID(graphic);
+ Bitmap **src_bitmaps = getBitmapsFromImageID(graphic);
int parameter[NUM_GFX_ARGS];
int i;
image_config_suffix[i].token,
image_config_suffix[i].type);
- set_graphic_parameters_ext(graphic, parameter, src_bitmap);
+ set_graphic_parameters_ext(graphic, parameter, src_bitmaps);
UPDATE_BUSY_STATE();
}
Error(ERR_INFO, "custom graphic rejected for this element/action");
if (graphic == fallback_graphic)
- Error(ERR_EXIT, "fatal error: no fallback graphic available");
+ Error(ERR_EXIT, "no fallback graphic available");
Error(ERR_INFO, "fallback done to 'char_exclam' for this graphic");
Error(ERR_INFO_LINE, "-");
Error(ERR_INFO, "custom graphic rejected for this element/action");
if (i == fallback_graphic)
- Error(ERR_EXIT, "fatal error: no fallback graphic available");
+ Error(ERR_EXIT, "no fallback graphic available");
Error(ERR_INFO, "fallback done to 'char_exclam' for this graphic");
Error(ERR_INFO_LINE, "-");
Error(ERR_INFO, "custom graphic rejected for this element/action");
if (i == fallback_graphic)
- Error(ERR_EXIT, "fatal error: no fallback graphic available");
+ Error(ERR_EXIT, "no fallback graphic available");
Error(ERR_INFO, "fallback done to 'char_exclam' for this graphic");
Error(ERR_INFO_LINE, "-");
print_timestamp_time("InitElementSmallImages");
InitScaledImages(); /* scale all other images, if needed */
print_timestamp_time("InitScaledImages");
+ InitBitmapPointers(); /* set standard size bitmap pointers */
+ print_timestamp_time("InitBitmapPointers");
InitFontGraphicInfo(); /* initialize text drawing functions */
print_timestamp_time("InitFontGraphicInfo");
font_info[i].token_name,
int2str(i, 0));
+ /* set default filenames for all cloned graphics in static configuration */
+ for (i = 0; image_config[i].token != NULL; i++)
+ {
+ if (strEqual(image_config[i].value, UNDEFINED_FILENAME))
+ {
+ char *token = image_config[i].token;
+ char *token_clone_from = getStringCat2(token, ".clone_from");
+ char *token_cloned = getHashEntry(image_config_hash, token_clone_from);
+
+ if (token_cloned != NULL)
+ {
+ char *value_cloned = getHashEntry(image_config_hash, token_cloned);
+
+ if (value_cloned != NULL)
+ {
+ /* set default filename in static configuration */
+ image_config[i].value = value_cloned;
+
+ /* set default filename in image config hash */
+ setHashEntry(image_config_hash, token, value_cloned);
+ }
+ }
+
+ free(token_clone_from);
+ }
+ }
+
/* always start with reliable default values (all elements) */
for (i = 0; i < MAX_NUM_ELEMENTS; i++)
ActiveElement[i] = i;
Error(ERR_EXIT, "image target directory '%s' not found or not writable",
global.create_images_dir);
}
+ else if (strPrefix(command, "create CE image "))
+ {
+ CreateCustomElementImages(&command[16]);
+
+ exit(0);
+ }
#if DEBUG
#if defined(TARGET_SDL2)
InitGfxScrollbufferInfo(FXSIZE, FYSIZE);
InitGfxClipRegion(FALSE, -1, -1, -1, -1);
+ /* required if door size definitions have changed */
+ InitGraphicCompatibilityInfo_Doors();
+
InitGfxBuffers_EM();
InitGfxBuffers_SP();
}
InitGfxBuffers();
InitGfxCustomArtworkInfo();
+ InitGfxOtherSettings();
bitmap_font_initial = LoadCustomImage(filename_font_initial);
font_height = getFontHeight(FC_RED);
- DrawInitTextAlways(getProgramInitString(), 20, FC_YELLOW);
- DrawInitTextAlways(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
- DrawInitTextAlways(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height,
- 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);
- DrawInitTextAlways("Loading graphics", 120, FC_GREEN);
+ DrawInitText("Loading graphics", 120, FC_GREEN);
/* initialize busy animation with default values */
int parameter[NUM_GFX_ARGS];
if (filename_anim_initial == NULL) /* should not happen */
Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_GLOBAL_BUSY);
- anim_initial.bitmap = LoadCustomImage(filename_anim_initial);
+ anim_initial.bitmaps =
+ checked_calloc(sizeof(Bitmap *) * NUM_IMG_BITMAP_POINTERS);
+
+ anim_initial.bitmaps[IMG_BITMAP_STANDARD] =
+ LoadCustomImage(filename_anim_initial);
graphic_info = &anim_initial; /* graphic == 0 => anim_initial */
- set_graphic_parameters_ext(0, parameter, anim_initial.bitmap);
+ set_graphic_parameters_ext(0, parameter, anim_initial.bitmaps);
graphic_info = graphic_info_last;
redraw_mask = REDRAW_ALL;
+ /* force drawing exit message even if screen updates are currently limited */
+ LimitScreenUpdates(FALSE);
+
BackToFront();
/* deactivate toons on error message screen */
print_timestamp_time("[init global stuff]");
+ InitSetup();
+
+ print_timestamp_time("[init setup/config stuff (1)]");
+
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();