#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 1
-
static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
static struct GraphicInfo anim_initial;
};
-static void print_timestamp_ext(char *message, char *mode)
-{
-#if DEBUG
-#if DEBUG_PRINT_INIT_TIMESTAMPS
- static char *debug_message = NULL;
- static char *last_message = NULL;
- static int counter_nr = 0;
- int max_depth = DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH;
-
- checked_free(debug_message);
- debug_message = getStringCat3(mode, " ", message);
-
- if (strEqual(mode, "INIT"))
- {
- debug_print_timestamp(counter_nr, NULL);
-
- if (counter_nr + 1 < max_depth)
- debug_print_timestamp(counter_nr, debug_message);
-
- counter_nr++;
-
- debug_print_timestamp(counter_nr, NULL);
- }
- else if (strEqual(mode, "DONE"))
- {
- counter_nr--;
-
- if (counter_nr + 1 < max_depth ||
- (counter_nr == 0 && max_depth == 1))
- {
- last_message = message;
-
- if (counter_nr == 0 && max_depth == 1)
- {
- checked_free(debug_message);
- debug_message = getStringCat3("TIME", " ", message);
- }
-
- debug_print_timestamp(counter_nr, debug_message);
- }
- }
- else if (!strEqual(mode, "TIME") ||
- !strEqual(message, last_message))
- {
- if (counter_nr < max_depth)
- debug_print_timestamp(counter_nr, debug_message);
- }
-#endif
-#endif
-}
-
-static void print_timestamp_init(char *message)
-{
- print_timestamp_ext(message, "INIT");
-}
-
-static void print_timestamp_time(char *message)
-{
- print_timestamp_ext(message, "TIME");
-}
-
-static void print_timestamp_done(char *message)
-{
- print_timestamp_ext(message, "DONE");
-}
-
void DrawInitAnim()
{
struct GraphicInfo *graphic_info_last = graphic_info;
int graphic = 0;
- static unsigned long action_delay = 0;
- unsigned long action_delay_value = GameFrameDelay;
+ static unsigned int action_delay = 0;
+ unsigned int action_delay_value = GameFrameDelay;
int sync_frame = FrameCounter;
int x, y;
#if 0
{
- static unsigned long last_counter = -1;
- unsigned long current_counter = Counter();
- unsigned long delay = current_counter - last_counter;
+ static unsigned int last_counter = -1;
+ unsigned int current_counter = Counter();
+ unsigned int delay = current_counter - last_counter;
if (last_counter != -1 && delay > action_delay_value + 5)
printf("::: DrawInitAnim: DELAY TOO LONG: %ld\n", delay);
printf("::: '%s' -> '%s'\n", fi->token, fi->filename);
#endif
- CreateImageWithSmallImages(graphic, graphic_info[graphic].scale_up_factor);
+ CreateImageWithSmallImages(graphic, graphic_info[graphic].scale_up_factor,
+ graphic_info[graphic].tile_size);
}
void InitElementSmallImages()
{
+ print_timestamp_init("InitElementSmallImages");
+
static int special_graphics[] =
{
IMG_EDITOR_ELEMENT_BORDER,
int num_property_mappings = getImageListPropertyMappingSize();
int i;
+ print_timestamp_time("getImageListPropertyMapping/Size");
+
+ print_timestamp_init("InitElementSmallImagesScaledUp (1)");
/* initialize normal 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 */
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) */
for (i = 0; i < num_property_mappings; i++)
InitElementSmallImagesScaledUp(property_mapping[i].artwork_index);
+ print_timestamp_time("InitElementSmallImagesScaledUp (3)");
/* initialize special images from above list (non-element images) */
for (i = 0; special_graphics[i] > -1; i++)
InitElementSmallImagesScaledUp(special_graphics[i]);
+ print_timestamp_time("InitElementSmallImagesScaledUp (4)");
+
+ print_timestamp_done("InitElementSmallImages");
}
void InitScaledImages()
if (strEqual(value_raw, ARG_UNDEFINED))
return ARG_UNDEFINED_VALUE;
-#if 1
if (type == TYPE_ELEMENT)
{
char *value = getHashEntry(element_token_hash, value_raw);
return (value != NULL ? atoi(value) : IMG_UNDEFINED);
}
-#else
-
- int i;
- int x = 0;
-
- /* !!! THIS IS BUGGY !!! NOT SURE IF YOU GET ELEMENT ID OR GRAPHIC ID !!! */
- /* !!! (possible reason why ".clone_from" with elements doesn't work) !!! */
-
- /* !!! OPTIMIZE THIS BY USING HASH !!! */
- for (i = 0; i < MAX_NUM_ELEMENTS; i++)
- if (strEqual(element_info[i].token_name, value_raw))
- return i;
-
- /* !!! OPTIMIZE THIS BY USING HASH !!! */
- for (i = 0; image_config[i].token != NULL; i++)
- {
- int len_config_value = strlen(image_config[i].value);
-
- if (!strEqual(&image_config[i].value[len_config_value - 4], ".pcx") &&
- !strEqual(&image_config[i].value[len_config_value - 4], ".wav") &&
- !strEqual(image_config[i].value, UNDEFINED_FILENAME))
- continue;
-
- if (strEqual(image_config[i].token, value_raw))
- return x;
-
- x++;
- }
-#endif
-
return -1;
}
g->diggable_like = -1; /* do not use clone element */
g->border_size = TILEX / 8; /* "CRUMBLED" border size */
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->anim_delay_fixed = 0;
g->anim_delay_random = 0;
g->scale_up_factor = 1; /* no scaling */
#endif
+#if 1
+ /* 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 */
+#endif
+
#if 1
if (g->use_image_size)
{
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;
- GC copy_clipmask_gc = None;
-#endif
-
/* use image size as default values for width and height for these images */
static int full_size_graphics[] =
{
IMG_BACKGROUND_ENVELOPE_2,
IMG_BACKGROUND_ENVELOPE_3,
IMG_BACKGROUND_ENVELOPE_4,
+ IMG_BACKGROUND_REQUEST,
IMG_BACKGROUND,
IMG_BACKGROUND_TITLE_INITIAL,
IMG_BACKGROUND_TITLE,
IMG_BACKGROUND_MAIN,
IMG_BACKGROUND_LEVELS,
+ IMG_BACKGROUND_LEVELNR,
IMG_BACKGROUND_SCORES,
IMG_BACKGROUND_EDITOR,
IMG_BACKGROUND_INFO,
IMG_BACKGROUND_INFO_MUSIC,
IMG_BACKGROUND_INFO_CREDITS,
IMG_BACKGROUND_INFO_PROGRAM,
+ IMG_BACKGROUND_INFO_VERSION,
IMG_BACKGROUND_INFO_LEVELSET,
IMG_BACKGROUND_SETUP,
+ IMG_BACKGROUND_PLAYING,
IMG_BACKGROUND_DOOR,
IMG_BACKGROUND_TAPE,
IMG_BACKGROUND_PANEL,
+ IMG_BACKGROUND_PALETTE,
+ IMG_BACKGROUND_TOOLBOX,
IMG_TITLESCREEN_INITIAL_1,
IMG_TITLESCREEN_INITIAL_2,
IMG_TITLESCREEN_4,
IMG_TITLESCREEN_5,
+ IMG_BACKGROUND_TITLEMESSAGE_INITIAL_1,
+ IMG_BACKGROUND_TITLEMESSAGE_INITIAL_2,
+ IMG_BACKGROUND_TITLEMESSAGE_INITIAL_3,
+ IMG_BACKGROUND_TITLEMESSAGE_INITIAL_4,
+ IMG_BACKGROUND_TITLEMESSAGE_INITIAL_5,
+ IMG_BACKGROUND_TITLEMESSAGE_1,
+ IMG_BACKGROUND_TITLEMESSAGE_2,
+ IMG_BACKGROUND_TITLEMESSAGE_3,
+ IMG_BACKGROUND_TITLEMESSAGE_4,
+ IMG_BACKGROUND_TITLEMESSAGE_5,
+
-1
};
graphic_info[full_size_graphics[i]].use_image_size = TRUE;
#endif
-#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
- if (clipmasks_initialized)
- {
- for (i = 0; i < num_images; i++)
- {
- if (graphic_info[i].clip_mask)
- XFreePixmap(display, graphic_info[i].clip_mask);
- if (graphic_info[i].clip_gc)
- XFreeGC(display, graphic_info[i].clip_gc);
-
- graphic_info[i].clip_mask = None;
- graphic_info[i].clip_gc = None;
- }
- }
-#endif
-
/* first set all graphic paramaters ... */
for (i = 0; i < num_images; i++)
set_graphic_parameters(i);
graphic_info[i] = graphic_info[fallback_graphic];
}
-
-#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
- /* currently we only need a tile clip mask from the first frame */
- getFixedGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y);
-
- if (copy_clipmask_gc == None)
- {
- clip_gc_values.graphics_exposures = False;
- clip_gc_valuemask = GCGraphicsExposures;
- copy_clipmask_gc = XCreateGC(display, src_bitmap->clip_mask,
- clip_gc_valuemask, &clip_gc_values);
- }
-
- graphic_info[i].clip_mask =
- XCreatePixmap(display, window->drawable, TILEX, TILEY, 1);
-
- src_pixmap = src_bitmap->clip_mask;
- XCopyArea(display, src_pixmap, graphic_info[i].clip_mask,
- copy_clipmask_gc, src_x, src_y, TILEX, TILEY, 0, 0);
-
- 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);
-
- clipmasks_initialized = TRUE;
-#endif
}
static void InitGraphicCompatibilityInfo()
}
}
+#if 1
+ InitGraphicCompatibilityInfo_Doors();
+#endif
+
+#if 0
+ struct
+ {
+ int graphic;
+ int *width, *height;
+ boolean right_wing;
+ }
+ doors[] =
+ {
+ { IMG_DOOR_1_WING_LEFT, &door_1.width, &door_1.height, FALSE },
+ { IMG_DOOR_1_WING_RIGHT, &door_1.width, &door_1.height, TRUE },
+ { IMG_DOOR_2_WING_LEFT, &door_2.width, &door_2.height, FALSE },
+ { IMG_DOOR_2_WING_RIGHT, &door_2.width, &door_2.height, TRUE },
+
+ { 0, NULL, NULL, FALSE }
+ };
+
+ for (i = 0; doors[i].graphic != 0; i++)
+ {
+ int graphic = doors[i].graphic;
+ int *width = doors[i].width;
+ int *height = doors[i].height;
+ boolean right_wing = doors[i].right_wing;
+
+ struct FileInfo *fi = getImageListEntryFromImageID(graphic);
+ struct GraphicInfo *g = &graphic_info[graphic];
+
+ if (!fi->redefined)
+ {
+ if (*width != -1)
+ {
+ // correct start position for right wing of "standard" door graphic
+ if (right_wing)
+ g->src_x += g->width - *width;
+
+ g->width = *width;
+ }
+
+ if (*height != -1)
+ g->height = *height;
+ }
+ }
+#endif
+
#if 0
for (i = 0; i < num_images; i++)
{
{
print_timestamp_init("ReinitializeGraphics");
+#if NEW_GAME_TILESIZE
+ InitGfxTileSizeInfo(game.tile_size, TILESIZE);
+#endif
+
InitGraphicInfo(); /* graphic properties mapping */
print_timestamp_time("InitGraphicInfo");
InitElementGraphicInfo(); /* element game graphic mapping */
print_timestamp_time("InitGadgets");
InitToons();
print_timestamp_time("InitToons");
+ InitDoors();
+ print_timestamp_time("InitDoors");
print_timestamp_done("ReinitializeGraphics");
}
/* create hash from graphic token list */
graphic_token_hash = newSetupFileHash();
for (graphic = 0, i = 0; image_config[i].token != NULL; i++)
- if (strSuffix(image_config[i].value, ".pcx") ||
+ if (strSuffix(image_config[i].value, ".png") ||
+ strSuffix(image_config[i].value, ".pcx") ||
strSuffix(image_config[i].value, ".wav") ||
strEqual(image_config[i].value, UNDEFINED_FILENAME))
setHashEntry(graphic_token_hash,
global.fading_type = TYPE_ENTER_MENU;
#endif
- global.use_envelope_request = FALSE; /* !!! MOVE TO ARTWORK CONFIG !!! */
+ global.use_envelope_request = FALSE;
}
void Execute_Command(char *command)
}
else if (strPrefix(command, "create images "))
{
-#if defined(TARGET_SDL)
global.create_images_dir = getStringCopy(&command[14]);
if (access(global.create_images_dir, W_OK) != 0)
Error(ERR_EXIT, "image target directory '%s' not found or not writable",
global.create_images_dir);
-#else
- Error(ERR_EXIT, "command only available for SDL target");
-#endif
}
#if DEBUG
-#if defined(TARGET_SDL)
+#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;
}
else
{
- printf("Available Modes:\n");
+ printf("Available display modes:\n");
- for(i = 0; modes[i]; i++)
- printf(" %d x %d\n", modes[i]->w, modes[i]->h);
+ for (i = 0; modes[i]; i++)
+ printf("- %d x %d\n", modes[i]->w, modes[i]->h);
}
exit(0);
void InitGfxBuffers()
{
+ /* 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);
+#if 0
ReCreateBitmap(&bitmap_db_door, 3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH);
+#endif
+ 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);
/* initialize screen properties */
bitmap_db_field);
InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE);
InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE);
+ InitGfxDoor3Info(EX, EY, EXSIZE, EYSIZE);
InitGfxWindowInfo(WIN_XSIZE, WIN_YSIZE);
InitGfxScrollbufferInfo(FXSIZE, FYSIZE);
InitGfxClipRegion(FALSE, -1, -1, -1, -1);
+ InitGfxBuffers_EM();
InitGfxBuffers_SP();
}
if (filename_font_initial == NULL) /* should not happen */
Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_FONT_INITIAL);
-#if 1
InitGfxBuffers();
-#else
- /* create additional image buffers for double-buffering and cross-fading */
- bitmap_db_store = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
- bitmap_db_cross = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
- bitmap_db_field = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH);
- bitmap_db_panel = CreateBitmap(DXSIZE, DYSIZE, DEFAULT_DEPTH);
- bitmap_db_door = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH);
- bitmap_db_toons = CreateBitmap(FULL_SXSIZE, FULL_SYSIZE, DEFAULT_DEPTH);
-
- /* initialize screen properties */
- InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE,
- REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE,
- bitmap_db_field);
- InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE);
- InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE);
- InitGfxWindowInfo(WIN_XSIZE, WIN_YSIZE);
- InitGfxScrollbufferInfo(FXSIZE, FYSIZE);
-#endif
-
InitGfxCustomArtworkInfo();
bitmap_font_initial = LoadCustomImage(filename_font_initial);
font_height = getFontHeight(FC_RED);
-#if 1
- DrawInitText(getWindowTitleString(), 20, FC_YELLOW);
+#if 0
+ DrawInitTextAlways(getWindowTitleString(), 20, FC_YELLOW);
#else
- DrawInitText(getProgramInitString(), 20, FC_YELLOW);
+ DrawInitTextAlways(getProgramInitString(), 20, FC_YELLOW);
#endif
- DrawInitText(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
- DrawInitText(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height, FC_RED);
+ DrawInitTextAlways(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
+ DrawInitTextAlways(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height,
+ FC_RED);
- DrawInitText("Loading graphics", 120, FC_GREEN);
+ DrawInitTextAlways("Loading graphics", 120, FC_GREEN);
#if 1
#if 1
#endif
print_timestamp_done("ReloadCustomArtwork");
+
+ LimitScreenUpdates(FALSE);
}
void KeyboardAutoRepeatOffUnlessAutoplay()
KeyboardAutoRepeatOff();
}
+void DisplayExitMessage(char *format, va_list ap)
+{
+ // check if draw buffer and fonts for exit message are already available
+ if (drawto == NULL || font_initial[NUM_INITIAL_FONTS - 1].bitmap == NULL)
+ return;
+
+ int font_1 = FC_RED;
+ int font_2 = FC_YELLOW;
+ int font_3 = FC_BLUE;
+ int font_width = getFontWidth(font_2);
+ int font_height = getFontHeight(font_2);
+ int sx = SX;
+ int sy = SY;
+ int sxsize = WIN_XSIZE - 2 * sx;
+ int sysize = WIN_YSIZE - 2 * sy;
+ int line_length = sxsize / font_width;
+ int max_lines = sysize / font_height;
+ int num_lines_printed;
+
+ gfx.sx = sx;
+ gfx.sy = sy;
+ gfx.sxsize = sxsize;
+ gfx.sysize = sysize;
+
+ sy = 20;
+
+ ClearRectangle(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
+
+ DrawTextSCentered(sy, font_1, "Fatal error:");
+ sy += 3 * font_height;;
+
+ num_lines_printed =
+ DrawTextBufferVA(sx, sy, format, ap, font_2,
+ line_length, line_length, max_lines,
+ 0, BLIT_ON_BACKGROUND, TRUE, TRUE, FALSE);
+ sy += (num_lines_printed + 3) * font_height;
+
+ DrawTextSCentered(sy, font_1, "For details, see the following error file:");
+ sy += 3 * font_height;
+
+ num_lines_printed =
+ DrawTextBuffer(sx, sy, program.error_filename, font_2,
+ line_length, line_length, max_lines,
+ 0, BLIT_ON_BACKGROUND, TRUE, TRUE, FALSE);
+
+ DrawTextSCentered(SYSIZE - 20, font_3, "Press any key or button to exit");
+
+ redraw_mask = REDRAW_ALL;
+
+ BackToFront();
+
+ /* deactivate toons on error message screen */
+ setup.toons = FALSE;
+
+ WaitForEventToContinue();
+}
+
/* ========================================================================= */
/* OpenAll() */
InitVideoDisplay();
InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen);
- InitEventFilter(FilterMouseMotionEvents);
+ InitEventFilter(FilterEvents);
print_timestamp_time("[init video stuff]");
DrawMainMenu();
InitNetworkServer();
+
+#if 0
+ Error(ERR_DEBUG, "::: SDL_GetBasePath() == '%s'",
+ SDL_GetBasePath());
+ Error(ERR_DEBUG, "::: SDL_GetPrefPath() == '%s'",
+ SDL_GetPrefPath("artsoft", "rocksndiamonds"));
+#if defined(PLATFORM_ANDROID)
+ Error(ERR_DEBUG, "::: SDL_AndroidGetInternalStoragePath() == '%s'",
+ SDL_AndroidGetInternalStoragePath());
+ 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"));
+#endif
+#endif
}
void CloseAllAndExit(int exit_value)
FreeAllImages();
#if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+ // !!! TODO !!!
+ // set a flag to tell the network server thread to quit and wait for it
+ // using SDL_WaitThread()
+#else
if (network_server) /* terminate network server */
SDL_KillThread(server_thread);
+#endif
#endif
CloseVideoDisplay();
ClosePlatformDependentStuff();
if (exit_value != 0)
- NotifyUserAboutErrorFile();
+ {
+ /* fall back to default level set (current set may have caused an error) */
+ SaveLevelSetup_LastSeries_Deactivate();
+
+ /* tell user where to find error log file which may contain more details */
+ // (error notification now directly displayed on screen inside R'n'D
+ // NotifyUserAboutErrorFile(); /* currently only works for Windows */
+ }
exit(exit_value);
}