#include "conf_e2g.c" /* include auto-generated data structure definitions */
#include "conf_esg.c" /* include auto-generated data structure definitions */
+#define CONFIG_TOKEN_FONT_INITIAL "font.initial"
-static Bitmap *bitmap_font_initial = NULL;
+struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
static void InitGlobal();
static void InitSetup();
static void InitGfx();
static void InitGfxBackground();
static void InitGadgets();
+static void InitFontGraphicInfo();
static void InitElementSmallImages();
static void InitElementGraphicInfo();
static void InitElementSpecialGraphicInfo();
"global.num_toons",
NULL
};
+ static char *ignore_sound_tokens[] =
+ {
+ "name",
+ "sort_priority",
+ NULL
+ };
int i;
for (i=0; i<MAX_NUM_ELEMENTS + 1; i++)
special_suffix[i] = special_suffix_info[i].suffix;
InitImageList(image_config, NUM_IMAGE_FILES, image_config_suffix,
- element_prefix, action_suffix, direction_suffix,special_suffix,
- ignore_image_tokens);
+ element_prefix, action_suffix, direction_suffix,
+ special_suffix, ignore_image_tokens);
InitSoundList(sound_config, NUM_SOUND_FILES, sound_config_suffix,
- sound_class_prefix, action_suffix, dummy, dummy, dummy);
+ sound_class_prefix, action_suffix, dummy,
+ dummy, ignore_sound_tokens);
}
void InitLevelArtworkInfo()
InitGraphicInfo(); /* graphic properties mapping */
InitElementSmallImages(); /* create editor and preview images */
+ InitFontGraphicInfo(); /* initialize text drawing functions */
- InitFontInfo(bitmap_font_initial,
- graphic_info[IMG_FONT_BIG].bitmap,
- graphic_info[IMG_FONT_MEDIUM].bitmap,
- graphic_info[IMG_FONT_SMALL].bitmap,
- graphic_info[IMG_FONT_EM].bitmap);
-
- SetMainBackgroundImage(IMG_BACKGROUND_DEFAULT);
+ SetMainBackgroundImage(IMG_BACKGROUND);
SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
InitGadgets();
void InitGfx()
{
- char *config_token_font_initial = "font.small";
char *filename_font_initial = NULL;
- int i;
+ Bitmap *bitmap_font_initial = NULL;
+ int i, j;
- /* determine filename for initial font (for displaying startup messages) */
+ /* determine settings for initial font (for displaying startup messages) */
for (i=0; image_config[i].token != NULL; i++)
- if (strcmp(image_config[i].token, config_token_font_initial) == 0)
- filename_font_initial = image_config[i].value;
+ {
+ for (j=0; j < NUM_INITIAL_FONTS; j++)
+ {
+ char font_token[128];
+ int len_font_token;
+
+ sprintf(font_token, "%s_%d", CONFIG_TOKEN_FONT_INITIAL, j + 1);
+ len_font_token = strlen(font_token);
+
+ if (strcmp(image_config[i].token, font_token) == 0)
+ filename_font_initial = image_config[i].value;
+ else if (strlen(image_config[i].token) > len_font_token &&
+ strncmp(image_config[i].token, font_token, len_font_token) == 0)
+ {
+ if (strcmp(&image_config[i].token[len_font_token], ".x") == 0)
+ font_initial[j].src_x = atoi(image_config[i].value);
+ else if (strcmp(&image_config[i].token[len_font_token], ".y") == 0)
+ font_initial[j].src_y = atoi(image_config[i].value);
+ else if (strcmp(&image_config[i].token[len_font_token], ".width") == 0)
+ font_initial[j].width = atoi(image_config[i].value);
+ else if (strcmp(&image_config[i].token[len_font_token],".height") == 0)
+ font_initial[j].height = atoi(image_config[i].value);
+ }
+ }
+ }
if (filename_font_initial == NULL) /* should not happen */
- Error(ERR_EXIT, "cannot get filename for '%s'", config_token_font_initial);
+ Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_FONT_INITIAL);
/* initialize screen properties */
InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE,
bitmap_font_initial = LoadCustomImage(filename_font_initial);
- InitFontInfo(bitmap_font_initial, NULL, NULL, NULL, NULL);
+ for (j=0; j < NUM_INITIAL_FONTS; j++)
+ font_initial[j].bitmap = bitmap_font_initial;
+
+ InitFontGraphicInfo();
DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW);
DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED);
for (i=0; element_to_special_graphic[i].element > -1; i++)
CreateImageWithSmallImages(element_to_special_graphic[i].graphic);
+ /* !!! CHECK FOR ELEMENT-ONLY GRAPHICS !!! */
/* initialize images from dynamic configuration */
for (i=0; i < num_property_mappings; i++)
CreateImageWithSmallImages(property_mapping[i].artwork_index);
}
+void InitFontGraphicInfo()
+{
+ static struct FontBitmapInfo font_bitmap_info[NUM_IMG_FONTS];
+ int num_fonts = NUM_IMG_FONTS;
+ int i;
+
+ if (graphic_info == NULL) /* still at startup phase */
+ num_fonts = NUM_INITIAL_FONTS;
+
+ for (i=0; i < num_fonts; i++)
+ {
+ if (i < NUM_INITIAL_FONTS)
+ font_bitmap_info[i] = font_initial[i];
+ else
+ {
+ /* copy font relevant information from graphics information */
+ font_bitmap_info[i].bitmap = graphic_info[FIRST_IMG_FONT + i].bitmap;
+ font_bitmap_info[i].src_x = graphic_info[FIRST_IMG_FONT + i].src_x;
+ font_bitmap_info[i].src_y = graphic_info[FIRST_IMG_FONT + i].src_y;
+ font_bitmap_info[i].width = graphic_info[FIRST_IMG_FONT + i].width;
+ font_bitmap_info[i].height = graphic_info[FIRST_IMG_FONT + i].height;
+ font_bitmap_info[i].draw_x = graphic_info[FIRST_IMG_FONT + i].draw_x;
+ font_bitmap_info[i].draw_y = graphic_info[FIRST_IMG_FONT + i].draw_y;
+ }
+ }
+
+ InitFontInfo(font_bitmap_info, num_fonts);
+}
+
void InitElementGraphicInfo()
{
struct PropertyMapping *property_mapping = getImageListPropertyMapping();
{
struct PropertyMapping *property_mapping = getImageListPropertyMapping();
int num_property_mappings = getImageListPropertyMappingSize();
- int i;
+ int i, j;
/* always start with reliable default values */
- for (i=0; i<MAX_NUM_ELEMENTS; i++)
- {
- element_info[i].editor_graphic = element_info[i].graphic[ACTION_DEFAULT];
- element_info[i].preview_graphic = element_info[i].graphic[ACTION_DEFAULT];
- }
+ for (i=0; i < MAX_NUM_ELEMENTS; i++)
+ for (j=0; j < NUM_SPECIAL_GFX_ARGS; j++)
+ element_info[i].special_graphic[j] =
+ element_info[i].graphic[ACTION_DEFAULT];
/* initialize special element/graphic mapping from static configuration */
for (i=0; element_to_special_graphic[i].element > -1; i++)
if (base_redefined && !special_redefined)
continue;
- if (special == GFX_SPECIAL_ARG_EDITOR)
- element_info[element].editor_graphic = graphic;
- else if (special == GFX_SPECIAL_ARG_PREVIEW)
- element_info[element].preview_graphic = graphic;
+ element_info[element].special_graphic[special] = graphic;
}
/* initialize special element/graphic mapping from dynamic configuration */
int special = property_mapping[i].ext3_index;
int graphic = property_mapping[i].artwork_index;
- if (special == GFX_SPECIAL_ARG_EDITOR)
- element_info[element].editor_graphic = graphic;
- else if (special == GFX_SPECIAL_ARG_PREVIEW)
- element_info[element].preview_graphic = graphic;
+ if (special >= 0 && special < NUM_SPECIAL_GFX_ARGS)
+ element_info[element].special_graphic[special] = graphic;
}
}
/* this is only used for toon animations */
graphic_info[graphic].step_offset = parameter[GFX_ARG_STEP_OFFSET];
graphic_info[graphic].step_delay = parameter[GFX_ARG_STEP_DELAY];
+
+ /* this is only used for drawing font characters */
+ graphic_info[graphic].draw_x = parameter[GFX_ARG_DRAW_XOFFSET];
+ graphic_info[graphic].draw_y = parameter[GFX_ARG_DRAW_YOFFSET];
}
static void InitGraphicInfo()
{
- static boolean clipmasks_initialized = FALSE;
int fallback_graphic = IMG_CHAR_EXCLAM;
struct FileInfo *fallback_image = getImageListEntry(fallback_graphic);
Bitmap *fallback_bitmap = getBitmapFromImageID(fallback_graphic);
int num_images = getImageListSize();
int i;
+
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+ static boolean clipmasks_initialized = FALSE;
Pixmap src_pixmap;
XGCValues clip_gc_values;
unsigned long clip_gc_valuemask;
clip_gc_values.graphics_exposures = False;
clip_gc_values.clip_mask = graphic_info[i].clip_mask;
clip_gc_valuemask = GCGraphicsExposures | GCClipMask;
+
graphic_info[i].clip_gc =
XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values);
#endif
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
if (copy_clipmask_gc)
XFreeGC(display, copy_clipmask_gc);
-#endif
clipmasks_initialized = TRUE;
+#endif
}
static void InitElementSoundInfo()
static int ep_solid[] =
{
- EL_STEELWALL,
EL_WALL,
EL_WALL_GROWING,
EL_WALL_GROWING_X,
EL_BD_MAGIC_WALL_DEAD,
EL_GAMEOFLIFE,
EL_BIOMAZE,
- EL_ACIDPOOL_TOPLEFT,
- EL_ACIDPOOL_TOPRIGHT,
- EL_ACIDPOOL_BOTTOMLEFT,
- EL_ACIDPOOL_BOTTOM,
- EL_ACIDPOOL_BOTTOMRIGHT,
EL_SP_CHIP_SINGLE,
EL_SP_CHIP_LEFT,
EL_SP_CHIP_RIGHT,
EL_SP_CHIP_UPPER,
EL_SP_CHIP_LOWER,
+ EL_SP_TERMINAL,
+ EL_SP_TERMINAL_ACTIVE,
+ EL_SP_EXIT_CLOSED,
+ EL_SP_EXIT_OPEN,
+ EL_INVISIBLE_WALL,
+ EL_INVISIBLE_WALL_ACTIVE,
+ EL_SWITCHGATE_SWITCH_UP,
+ EL_SWITCHGATE_SWITCH_DOWN,
+ EL_TIMEGATE_SWITCH,
+ EL_TIMEGATE_SWITCH_ACTIVE,
+ EL_EMC_WALL_PILLAR_UPPER,
+ EL_EMC_WALL_PILLAR_MIDDLE,
+ EL_EMC_WALL_PILLAR_LOWER,
+ EL_EMC_WALL4,
+ EL_EMC_WALL5,
+ EL_EMC_WALL6,
+ EL_EMC_WALL7,
+ EL_EMC_WALL8,
+ EL_WALL_PEARL,
+ EL_WALL_CRYSTAL,
+
+ /* the following elements are a direct copy of "indestructible" elements,
+ except "EL_ACID", which is "indestructible", but not "solid"! */
+#if 0
+ EL_ACID,
+#endif
+ EL_STEELWALL,
+ EL_ACIDPOOL_TOPLEFT,
+ EL_ACIDPOOL_TOPRIGHT,
+ EL_ACIDPOOL_BOTTOMLEFT,
+ EL_ACIDPOOL_BOTTOM,
+ EL_ACIDPOOL_BOTTOMRIGHT,
EL_SP_HARD_GRAY,
EL_SP_HARD_GREEN,
EL_SP_HARD_BLUE,
EL_SP_HARD_BASE4,
EL_SP_HARD_BASE5,
EL_SP_HARD_BASE6,
- EL_SP_TERMINAL,
- EL_SP_TERMINAL_ACTIVE,
- EL_SP_EXIT_CLOSED,
- EL_SP_EXIT_OPEN,
EL_INVISIBLE_STEELWALL,
EL_INVISIBLE_STEELWALL_ACTIVE,
- EL_INVISIBLE_WALL,
- EL_INVISIBLE_WALL_ACTIVE,
EL_CONVEYOR_BELT1_SWITCH_LEFT,
EL_CONVEYOR_BELT1_SWITCH_MIDDLE,
EL_CONVEYOR_BELT1_SWITCH_RIGHT,
EL_CONVEYOR_BELT4_SWITCH_LEFT,
EL_CONVEYOR_BELT4_SWITCH_MIDDLE,
EL_CONVEYOR_BELT4_SWITCH_RIGHT,
- EL_SWITCHGATE_SWITCH_UP,
- EL_SWITCHGATE_SWITCH_DOWN,
EL_LIGHT_SWITCH,
EL_LIGHT_SWITCH_ACTIVE,
- EL_TIMEGATE_SWITCH,
- EL_TIMEGATE_SWITCH_ACTIVE,
EL_SIGN_EXCLAMATION,
EL_SIGN_RADIOACTIVITY,
EL_SIGN_STOP,
EL_EMC_STEELWALL2,
EL_EMC_STEELWALL3,
EL_EMC_STEELWALL4,
- EL_EMC_WALL_PILLAR_UPPER,
- EL_EMC_WALL_PILLAR_MIDDLE,
- EL_EMC_WALL_PILLAR_LOWER,
- EL_EMC_WALL4,
- EL_EMC_WALL5,
- EL_EMC_WALL6,
- EL_EMC_WALL7,
- EL_EMC_WALL8,
EL_CRYSTAL,
- EL_WALL_PEARL,
- EL_WALL_CRYSTAL,
EL_GATE1,
EL_GATE2,
EL_GATE3,
};
static int ep_solid_num = SIZEOF_ARRAY_INT(ep_solid);
- static int ep_massive[] =
+ static int ep_indestructible[] =
{
EL_STEELWALL,
EL_ACID,
EL_TUBE_RIGHT_UP,
EL_TUBE_RIGHT_DOWN
};
- static int ep_massive_num = SIZEOF_ARRAY_INT(ep_massive);
+ static int ep_indestructible_num = SIZEOF_ARRAY_INT(ep_indestructible);
static int ep_slippery[] =
{
EP_BIT_SCHLUESSEL,
EP_BIT_PFORTE,
EP_BIT_SOLID,
- EP_BIT_MASSIVE,
+ EP_BIT_INDESTRUCTIBLE,
EP_BIT_SLIPPERY,
EP_BIT_ENEMY,
EP_BIT_MAUER,
ep_schluessel,
ep_pforte,
ep_solid,
- ep_massive,
+ ep_indestructible,
ep_slippery,
ep_enemy,
ep_mauer,
&ep_schluessel_num,
&ep_pforte_num,
&ep_solid_num,
- &ep_massive_num,
+ &ep_indestructible_num,
&ep_slippery_num,
&ep_enemy_num,
&ep_mauer_num,
FreeAllImages();
FreeTileClipmasks();
- if (bitmap_font_initial)
- FreeBitmap(bitmap_font_initial);
-
CloseVideoDisplay();
ClosePlatformDependantStuff();