#include "conf_fnt.c" /* include auto-generated data structure definitions */
#include "conf_g2s.c" /* include auto-generated data structure definitions */
#include "conf_g2m.c" /* include auto-generated data structure definitions */
+#include "conf_act.c" /* include auto-generated data structure definitions */
#define CONFIG_TOKEN_FONT_INITIAL "font.initial"
+#define CONFIG_TOKEN_GLOBAL_BUSY "global.busy"
+
+#define DEBUG_PRINT_INIT_TIMESTAMPS TRUE
+#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH 5
static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
+static struct GraphicInfo anim_initial;
static int copy_properties[][5] =
{
}
};
+
+static void print_init_timestamp(char *message)
+{
+#if DEBUG
+#if DEBUG_PRINT_INIT_TIMESTAMPS
+ static char *last_message = NULL;
+ static int counter_nr = 0;
+ int max_depth = DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH;
+
+ if (strEqualPrefix(message, "INIT"))
+ {
+ if (counter_nr + 1 < max_depth)
+ {
+ debug_print_timestamp(counter_nr, NULL);
+ debug_print_timestamp(counter_nr, message);
+ }
+
+ counter_nr++;
+
+ debug_print_timestamp(counter_nr, NULL);
+ }
+ else if (strEqualPrefix(message, "DONE"))
+ {
+ counter_nr--;
+
+ if (counter_nr + 1 < max_depth)
+ {
+ last_message = &message[4];
+
+ debug_print_timestamp(counter_nr, message);
+ }
+ }
+ else if (!strEqualPrefix(message, "TIME") ||
+ !strEqualSuffix(message, last_message))
+ {
+ if (counter_nr < max_depth)
+ debug_print_timestamp(counter_nr, message);
+ }
+#endif
+#endif
+}
+
+void DrawInitAnim()
+{
+ struct GraphicInfo *graphic_info_last = graphic_info;
+ int graphic = 0;
+ static unsigned long action_delay = 0;
+ unsigned long action_delay_value = GameFrameDelay;
+ int sync_frame = FrameCounter;
+ int x, y;
+
+ if (anim_initial.bitmap == NULL || window == NULL)
+ return;
+
+ if (!DelayReached(&action_delay, action_delay_value))
+ return;
+
+#if 0
+ {
+ static unsigned long last_counter = -1;
+ unsigned long current_counter = Counter();
+ unsigned long delay = current_counter - last_counter;
+
+ if (last_counter != -1 && delay > action_delay_value + 5)
+ printf("::: DrawInitAnim: DELAY TOO LONG: %ld\n", delay);
+
+ last_counter = current_counter;
+ }
+#endif
+
+ anim_initial.anim_mode = ANIM_LOOP;
+ anim_initial.anim_start_frame = 0;
+ anim_initial.offset_x = anim_initial.width;
+ anim_initial.offset_y = 0;
+
+ x = WIN_XSIZE / 2 - TILESIZE / 2;
+ y = WIN_YSIZE / 2 - TILESIZE / 2;
+
+ graphic_info = &anim_initial;
+
+ if (sync_frame % anim_initial.anim_delay == 0)
+ DrawGraphicAnimationExt(window, x, y, graphic, sync_frame, NO_MASKING);
+
+ graphic_info = graphic_info_last;
+
+ FrameCounter++;
+}
+
void FreeGadgets()
{
FreeLevelEditorGadgets();
inline void InitElementSmallImagesScaledUp(int graphic)
{
+#if 0
+ struct FileInfo *fi = getImageListEntryFromImageID(graphic);
+
+ printf("::: '%s' -> '%s'\n", fi->token, fi->filename);
+#endif
+
CreateImageWithSmallImages(graphic, graphic_info[graphic].scale_up_factor);
}
}
}
+ UPDATE_BUSY_STATE();
+
/* initialize normal element/graphic mapping from static configuration */
for (i = 0; element_to_graphic[i].element > -1; i++)
{
int graphic = property_mapping[i].artwork_index;
boolean crumbled = FALSE;
+#if 0
+ if ((element == EL_EM_DYNAMITE ||
+ element == EL_EM_DYNAMITE_ACTIVE) &&
+ action == ACTION_ACTIVE &&
+ (special == GFX_SPECIAL_ARG_EDITOR ||
+ special == GFX_SPECIAL_ARG_PANEL))
+ printf("::: DYNAMIC: %d, %d, %d -> %d\n",
+ element, action, special, graphic);
+#endif
+
if (special == GFX_SPECIAL_ARG_CRUMBLED)
{
special = -1;
}
}
+ UPDATE_BUSY_STATE();
+
/* adjust graphics with 2nd tile for movement according to direction
(do this before correcting '-1' values to minimize calculations) */
for (i = 0; i < MAX_NUM_ELEMENTS; i++)
}
}
+ UPDATE_BUSY_STATE();
+
/* now set all '-1' values to element specific default values */
for (i = 0; i < MAX_NUM_ELEMENTS; i++)
{
}
}
+ UPDATE_BUSY_STATE();
+
#if 0
/* !!! THIS ALSO CLEARS SPECIAL FLAGS (AND IS NOT NEEDED ANYWAY) !!! */
/* set animation mode to "none" for each graphic with only 1 frame */
boolean special_redefined =
getImageListEntryFromImageID(graphic)->redefined;
+#if 0
+ if ((element == EL_EM_DYNAMITE ||
+ element == EL_EM_DYNAMITE_ACTIVE) &&
+ (special == GFX_SPECIAL_ARG_EDITOR ||
+ special == GFX_SPECIAL_ARG_PANEL))
+ printf("::: SPECIAL STATIC: %d, %d -> %d\n",
+ element, special, graphic);
+#endif
+
/* 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
/* initialize special element/graphic mapping from dynamic configuration */
for (i = 0; i < num_property_mappings; i++)
{
- int element = property_mapping[i].base_index;
- int special = property_mapping[i].ext3_index;
- int graphic = property_mapping[i].artwork_index;
+ int element = property_mapping[i].base_index;
+ int action = property_mapping[i].ext1_index;
+ int direction = property_mapping[i].ext2_index;
+ int special = property_mapping[i].ext3_index;
+ int graphic = property_mapping[i].artwork_index;
+
+#if 0
+ if ((element == EL_EM_DYNAMITE ||
+ element == EL_EM_DYNAMITE_ACTIVE ||
+ element == EL_CONVEYOR_BELT_1_MIDDLE ||
+ element == EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE) &&
+ (special == GFX_SPECIAL_ARG_EDITOR ||
+ special == GFX_SPECIAL_ARG_PANEL))
+ printf("::: SPECIAL DYNAMIC: %d, %d -> %d [%d]\n",
+ element, special, graphic, property_mapping[i].ext1_index);
+#endif
+
+#if 0
+ if (element == EL_CONVEYOR_BELT_1_MIDDLE &&
+ action == ACTION_ACTIVE)
+ {
+ element = EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE;
+ action = -1;
+ }
+#endif
+
+#if 0
+ if (element == EL_MAGIC_WALL &&
+ action == ACTION_ACTIVE)
+ {
+ element = EL_MAGIC_WALL_ACTIVE;
+ action = -1;
+ }
+#endif
+
+#if 1
+ /* for action ".active", replace element with active element, if exists */
+ if (action == ACTION_ACTIVE && element != ELEMENT_ACTIVE(element))
+ {
+ element = ELEMENT_ACTIVE(element);
+ action = -1;
+ }
+#endif
if (element >= MAX_NUM_ELEMENTS)
continue;
+ /* do not change special graphic if action or direction was specified */
+ if (action != -1 || direction != -1)
+ continue;
+
if (IS_SPECIAL_GFX_ARG(special))
element_info[element].special_graphic[special] = graphic;
}
graphic_info[graphic].valign = parameter[GFX_ARG_VALIGN];
if (parameter[GFX_ARG_SORT_PRIORITY] != ARG_UNDEFINED_VALUE)
graphic_info[graphic].sort_priority = parameter[GFX_ARG_SORT_PRIORITY];
+
+ UPDATE_BUSY_STATE();
}
static void set_cloned_graphic_parameters(int graphic)
static void ReinitializeGraphics()
{
+ print_init_timestamp("INIT ReinitializeGraphics");
+
InitGraphicInfo(); /* graphic properties mapping */
+ print_init_timestamp("TIME InitGraphicInfo");
InitElementGraphicInfo(); /* element game graphic mapping */
+ print_init_timestamp("TIME InitElementGraphicInfo");
InitElementSpecialGraphicInfo(); /* element special graphic mapping */
+ print_init_timestamp("TIME InitElementSpecialGraphicInfo");
InitElementSmallImages(); /* scale elements to all needed sizes */
+ print_init_timestamp("TIME InitElementSmallImages");
InitScaledImages(); /* scale all other images, if needed */
+ print_init_timestamp("TIME InitScaledImages");
InitFontGraphicInfo(); /* initialize text drawing functions */
+ print_init_timestamp("TIME InitFontGraphicInfo");
InitGraphicInfo_EM(); /* graphic mapping for EM engine */
+ print_init_timestamp("TIME InitGraphicInfo_EM");
SetMainBackgroundImage(IMG_BACKGROUND);
+ print_init_timestamp("TIME SetMainBackgroundImage");
SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
+ print_init_timestamp("TIME SetDoorBackgroundImage");
InitGadgets();
+ print_init_timestamp("TIME InitGadgets");
InitToons();
+ print_init_timestamp("TIME InitToons");
+
+ print_init_timestamp("DONE ReinitializeGraphics");
}
static void ReinitializeSounds()
element_info[i].token_name = element_name_info[i].token_name;
element_info[i].class_name = element_name_info[i].class_name;
- element_info[i].editor_description=element_name_info[i].editor_description;
+ element_info[i].editor_description= element_name_info[i].editor_description;
#if 0
printf("%04d: %s\n", i, element_name_info[i].token_name);
#endif
}
+ /* always start with reliable default values (all elements) */
+ for (i = 0; i < MAX_NUM_ELEMENTS; i++)
+ ActiveElement[i] = i;
+
+ /* now add all entries that have an active state (active elements) */
+ for (i = 0; element_with_active_state[i].element != -1; i++)
+ {
+ int element = element_with_active_state[i].element;
+ int element_active = element_with_active_state[i].element_active;
+
+ ActiveElement[element] = element_active;
+ }
+
+ /* always start with reliable default values (all buttons) */
+ for (i = 0; i < NUM_IMAGE_FILES; i++)
+ ActiveButton[i] = i;
+
+ /* now add all entries that have an active state (active buttons) */
+ for (i = 0; button_with_active_state[i].button != -1; i++)
+ {
+ int button = button_with_active_state[i].button;
+ int button_active = button_with_active_state[i].button_active;
+
+ ActiveButton[button] = button_active;
+ }
+
+ /* always start with reliable default values (all fonts) */
+ for (i = 0; i < NUM_FONTS; i++)
+ ActiveFont[i] = i;
+
+ /* now add all entries that have an active state (active fonts) */
+ for (i = 0; font_with_active_state[i].font_nr != -1; i++)
+ {
+ int font = font_with_active_state[i].font_nr;
+ int font_active = font_with_active_state[i].font_nr_active;
+
+ ActiveFont[font] = font_active;
+ }
+
global.autoplay_leveldir = NULL;
global.convert_leveldir = NULL;
global.frames_per_second = 0;
global.fps_slowdown = FALSE;
global.fps_slowdown_factor = 1;
+
+ global.border_status = GAME_MODE_MAIN;
+#if 0
+ global.fading_status = GAME_MODE_MAIN;
+ global.fading_type = TYPE_ENTER_MENU;
+#endif
}
void Execute_Command(char *command)
void InitGfx()
{
char *filename_font_initial = NULL;
+ char *filename_anim_initial = NULL;
Bitmap *bitmap_font_initial = NULL;
int font_height;
int i, j;
font_initial[j].src_y = atoi(image_config[i].value);
else if (strEqual(&image_config[i].token[len_font_token], ".width"))
font_initial[j].width = atoi(image_config[i].value);
- else if (strEqual(&image_config[i].token[len_font_token],".height"))
+ else if (strEqual(&image_config[i].token[len_font_token], ".height"))
font_initial[j].height = atoi(image_config[i].value);
}
}
DrawInitText(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height, FC_RED);
DrawInitText("Loading graphics", 120, FC_GREEN);
+
+#if 1
+ /* 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);
+
+ 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 (strEqual(&image_config[i].token[len_anim_token], ".x"))
+ anim_initial.src_x = atoi(image_config[i].value);
+ else if (strEqual(&image_config[i].token[len_anim_token], ".y"))
+ anim_initial.src_y = atoi(image_config[i].value);
+ else if (strEqual(&image_config[i].token[len_anim_token], ".width"))
+ anim_initial.width = atoi(image_config[i].value);
+ else if (strEqual(&image_config[i].token[len_anim_token], ".height"))
+ anim_initial.height = atoi(image_config[i].value);
+ else if (strEqual(&image_config[i].token[len_anim_token], ".frames"))
+ anim_initial.anim_frames = atoi(image_config[i].value);
+ else if (strEqual(&image_config[i].token[len_anim_token],
+ ".frames_per_line"))
+ anim_initial.anim_frames_per_line = atoi(image_config[i].value);
+ else if (strEqual(&image_config[i].token[len_anim_token], ".delay"))
+ anim_initial.anim_delay = atoi(image_config[i].value);
+ }
+ }
+
+ 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);
+
+ InitGfxDrawBusyAnimFunction(DrawInitAnim);
+#endif
}
void RedrawBackground()
static void InitImages()
{
+ print_init_timestamp("INIT InitImages");
+
setLevelArtworkDir(artwork.gfx_first);
#if 0
leveldir_current->graphics_path);
#endif
+ UPDATE_BUSY_STATE();
+
ReloadCustomImages();
+ print_init_timestamp("TIME ReloadCustomImages");
+
+ UPDATE_BUSY_STATE();
LoadCustomElementDescriptions();
- LoadSpecialMenuDesignSettings();
+ print_init_timestamp("TIME LoadCustomElementDescriptions");
+
+ UPDATE_BUSY_STATE();
+
+ LoadMenuDesignSettings();
+ print_init_timestamp("TIME LoadMenuDesignSettings");
+
+ UPDATE_BUSY_STATE();
ReinitializeGraphics();
+ print_init_timestamp("TIME ReinitializeGraphics");
+
+ UPDATE_BUSY_STATE();
+
+ print_init_timestamp("DONE InitImages");
}
static void InitSound(char *identifier)
{
+ print_init_timestamp("INIT InitSound");
+
if (identifier == NULL)
identifier = artwork.snd_current->identifier;
setLevelArtworkDir(artwork.snd_first);
InitReloadCustomSounds(identifier);
+ print_init_timestamp("TIME InitReloadCustomSounds");
+
ReinitializeSounds();
+ print_init_timestamp("TIME ReinitializeSounds");
+
+ print_init_timestamp("DONE InitSound");
}
static void InitMusic(char *identifier)
{
+ print_init_timestamp("INIT InitMusic");
+
if (identifier == NULL)
identifier = artwork.mus_current->identifier;
setLevelArtworkDir(artwork.mus_first);
InitReloadCustomMusic(identifier);
+ print_init_timestamp("TIME InitReloadCustomMusic");
+
ReinitializeMusic();
+ print_init_timestamp("TIME ReinitializeMusic");
+
+ print_init_timestamp("DONE InitMusic");
}
void InitNetworkServer()
boolean force_reload_gfx = (force_reload & (1 << ARTWORK_TYPE_GRAPHICS));
boolean force_reload_snd = (force_reload & (1 << ARTWORK_TYPE_SOUNDS));
boolean force_reload_mus = (force_reload & (1 << ARTWORK_TYPE_MUSIC));
- boolean redraw_screen = FALSE;
+ boolean reload_needed;
force_reload_gfx |= AdjustGraphicsForEMC();
snd_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_SOUNDS);
mus_new_identifier = getNewArtworkIdentifier(ARTWORK_TYPE_MUSIC);
+ reload_needed = (gfx_new_identifier != NULL || force_reload_gfx ||
+ snd_new_identifier != NULL || force_reload_snd ||
+ mus_new_identifier != NULL || force_reload_mus);
+
+ if (!reload_needed)
+ return;
+
+ print_init_timestamp("INIT ReloadCustomArtwork");
+
+ ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
+ print_init_timestamp("TIME ClearRectangle");
+
if (gfx_new_identifier != NULL || force_reload_gfx)
{
#if 0
leveldir_current->graphics_set);
#endif
- ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
-
InitImages();
-
- redraw_screen = TRUE;
+ print_init_timestamp("TIME InitImages");
}
if (snd_new_identifier != NULL || force_reload_snd)
{
- ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
-
InitSound(snd_new_identifier);
-
- redraw_screen = TRUE;
+ print_init_timestamp("TIME InitSound");
}
if (mus_new_identifier != NULL || force_reload_mus)
{
- ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
-
InitMusic(mus_new_identifier);
-
- redraw_screen = TRUE;
+ print_init_timestamp("TIME InitMusic");
}
- if (redraw_screen)
- {
- RedrawBackground();
+ RedrawBackground();
- /* force redraw of (open or closed) door graphics */
- SetDoorState(DOOR_OPEN_ALL);
- CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
+ /* force redraw of (open or closed) door graphics */
+ SetDoorState(DOOR_OPEN_ALL);
+ CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
#if 1
#if 1
- FadeSetEnterScreen();
- // FadeSkipNextFadeOut();
- // FadeSetDisabled();
+ FadeSetEnterScreen();
+ // FadeSkipNextFadeOut();
+ // FadeSetDisabled();
#else
- FadeSkipNext();
+ FadeSkipNext();
#endif
#else
- fading = fading_none;
+ fading = fading_none;
#endif
- }
+
+ print_init_timestamp("DONE ReloadCustomArtwork");
}
void KeyboardAutoRepeatOffUnlessAutoplay()
void OpenAll()
{
+ print_init_timestamp("INIT OpenAll");
+
InitGlobal(); /* initialize some global variables */
if (options.execute_command)
InitJoysticks();
+ print_init_timestamp("TIME [pre-video]");
+
InitVideoDisplay();
InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen);
InitElementPropertiesStatic();
InitElementPropertiesEngine(GAME_VERSION_ACTUAL);
+ print_init_timestamp("TIME [post-video]");
+
InitGfx();
- // debug_print_timestamp(0, "INIT");
+ print_init_timestamp("TIME InitGfx");
+
InitLevelInfo();
- // debug_print_timestamp(0, "TIME InitLevelInfo: ");
+ print_init_timestamp("TIME InitLevelInfo");
+
InitLevelArtworkInfo();
- // debug_print_timestamp(0, "TIME InitLevelArtworkInfo: ");
+ print_init_timestamp("TIME InitLevelArtworkInfo");
InitImages(); /* needs to know current level directory */
+ print_init_timestamp("TIME InitImages");
+
InitSound(NULL); /* needs to know current level directory */
+ print_init_timestamp("TIME InitSound");
+
InitMusic(NULL); /* needs to know current level directory */
+ print_init_timestamp("TIME InitMusic");
InitGfxBackground();
fading = fading_none;
#endif
+ print_init_timestamp("TIME [post-artwork]");
+
+ print_init_timestamp("DONE OpenAll");
+
DrawMainMenu();
InitNetworkServer();