X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=7eaadf68aae617e52ae4c2e56aa9644e178f1f91;hb=dfe0a71a9939e0c55bb54dcc92db1749e8e21747;hp=3d00d8e890d4ec419a0907220c76c3adaab1f229;hpb=11db3a75c0ab5b9e8c98b4cdbb17080f9dc3d1a5;p=rocksndiamonds.git diff --git a/src/libgame/system.c b/src/libgame/system.c index 3d00d8e8..7eaadf68 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -22,6 +22,8 @@ #include "system.h" #include "sound.h" +#include "setup.h" +#include "joystick.h" #include "misc.h" @@ -34,26 +36,30 @@ struct OptionInfo options; struct VideoSystemInfo video; struct AudioSystemInfo audio; struct GfxInfo gfx; +struct ArtworkInfo artwork; +struct JoystickInfo joystick; +struct SetupInfo setup; -struct LevelDirInfo *leveldir_first = NULL; -struct LevelDirInfo *leveldir_current = NULL; +LevelDirTree *leveldir_first = NULL; +LevelDirTree *leveldir_current = NULL; +int level_nr; -Display *display = NULL; -Visual *visual = NULL; -int screen = 0; -Colormap cmap = None; +Display *display = NULL; +Visual *visual = NULL; +int screen = 0; +Colormap cmap = None; -DrawWindow *window = NULL; -DrawBuffer *backbuffer = NULL; -DrawBuffer *drawto = NULL; +DrawWindow *window = NULL; +DrawBuffer *backbuffer = NULL; +DrawBuffer *drawto = NULL; -int button_status = MB_NOT_PRESSED; -boolean motion_status = FALSE; +int button_status = MB_NOT_PRESSED; +boolean motion_status = FALSE; -int redraw_mask = REDRAW_NONE; -int redraw_tiles = 0; +int redraw_mask = REDRAW_NONE; +int redraw_tiles = 0; -int FrameCounter = 0; +int FrameCounter = 0; /* ========================================================================= */ @@ -106,16 +112,11 @@ void ClosePlatformDependantStuff(void) void InitProgramInfo(char *unix_userdata_directory, char *program_title, char *window_title, char *icon_title, - char *x11_icon_basename, char *x11_iconmask_basename, - char *msdos_pointer_basename) + char *x11_icon_filename, char *x11_iconmask_filename, + char *msdos_pointer_filename, + char *cookie_prefix, char *filename_prefix, + int program_version) { - char *x11_icon_filename = - getPath2(options.graphics_directory, x11_icon_basename); - char *x11_iconmask_filename = - getPath2(options.graphics_directory, x11_iconmask_basename); - char *msdos_pointer_filename = - getPath2(options.graphics_directory, msdos_pointer_basename); - #if defined(PLATFORM_UNIX) program.userdata_directory = unix_userdata_directory; #else @@ -128,6 +129,13 @@ void InitProgramInfo(char *unix_userdata_directory, char *program_title, program.x11_icon_filename = x11_icon_filename; program.x11_iconmask_filename = x11_iconmask_filename; program.msdos_pointer_filename = msdos_pointer_filename; + + program.cookie_prefix = cookie_prefix; + program.filename_prefix = filename_prefix; + + program.version_major = VERSION_MAJOR(program_version); + program.version_minor = VERSION_MINOR(program_version); + program.version_patch = VERSION_PATCH(program_version); } void InitGfxFieldInfo(int sx, int sy, int sxsize, int sysize, @@ -142,6 +150,8 @@ void InitGfxFieldInfo(int sx, int sy, int sxsize, int sysize, gfx.real_sy = real_sy; gfx.full_sxsize = full_sxsize; gfx.full_sysize = full_sysize; + + SetDrawDeactivationMask(REDRAW_NONE); /* do not deactivate drawing */ } void InitGfxDoor1Info(int dx, int dy, int dxsize, int dysize) @@ -167,6 +177,11 @@ void InitGfxScrollbufferInfo(int scrollbuffer_width, int scrollbuffer_height) gfx.scrollbuffer_height = scrollbuffer_height; } +void SetDrawDeactivationMask(int draw_deactivation_mask) +{ + gfx.draw_deactivation_mask = draw_deactivation_mask; +} + /* ========================================================================= */ /* video functions */ @@ -193,6 +208,7 @@ inline void CloseVideoDisplay(void) #if defined(TARGET_SDL) SDL_QuitSubSystem(SDL_INIT_VIDEO); #else + if (display) XCloseDisplay(display); #endif @@ -284,6 +300,9 @@ inline void FreeBitmap(Bitmap *bitmap) XFreeGC(display, bitmap->stored_clip_gc); #endif + if (bitmap->source_filename) + free(bitmap->source_filename); + free(bitmap); } @@ -300,11 +319,26 @@ inline void CloseWindow(DrawWindow *window) #endif } +inline boolean DrawingDeactivated(int x, int y, int width, int height) +{ + if (gfx.draw_deactivation_mask != REDRAW_NONE) + { + if ((gfx.draw_deactivation_mask & REDRAW_FIELD) && + x < gfx.sx + gfx.sxsize) + return TRUE; + } + + return FALSE; +} + inline void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap, int src_x, int src_y, int width, int height, int dst_x, int dst_y) { + if (DrawingDeactivated(dst_x, dst_y, width, height)) + return; + #ifdef TARGET_SDL SDLCopyArea(src_bitmap, dst_bitmap, src_x, src_y, width, height, dst_x, dst_y, SDLCOPYAREA_OPAQUE); @@ -316,6 +350,9 @@ inline void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap, inline void ClearRectangle(Bitmap *bitmap, int x, int y, int width, int height) { + if (DrawingDeactivated(x, y, width, height)) + return; + #ifdef TARGET_SDL SDLFillRectangle(bitmap, x, y, width, height, 0x000000); #else @@ -362,6 +399,9 @@ inline void BlitBitmapMasked(Bitmap *src_bitmap, Bitmap *dst_bitmap, int width, int height, int dst_x, int dst_y) { + if (DrawingDeactivated(dst_x, dst_y, width, height)) + return; + #ifdef TARGET_SDL SDLCopyArea(src_bitmap, dst_bitmap, src_x, src_y, width, height, dst_x, dst_y, SDLCOPYAREA_MASKED); @@ -578,10 +618,9 @@ inline boolean ChangeVideoModeIfNeeded(boolean fullscreen) return fullscreen; } -Bitmap *LoadImage(char *basename) +Bitmap *LoadImage(char *filename) { Bitmap *new_bitmap; - char *filename = getPath2(options.graphics_directory, basename); #if defined(TARGET_SDL) new_bitmap = SDLLoadImage(filename); @@ -589,11 +628,71 @@ Bitmap *LoadImage(char *basename) new_bitmap = X11LoadImage(filename); #endif - free(filename); + new_bitmap->source_filename = getStringCopy(filename); return new_bitmap; } +Bitmap *LoadCustomImage(char *basename) +{ + char *filename = getCustomImageFilename(basename); + Bitmap *new_bitmap; + + if (filename == NULL) + Error(ERR_EXIT, "LoadCustomImage(): cannot find file '%s'", basename); + + if ((new_bitmap = LoadImage(filename)) == NULL) + Error(ERR_EXIT, "LoadImage() failed: %s", GetError()); + + return new_bitmap; +} + +void ReloadCustomImage(Bitmap **bitmap, char *basename) +{ + char *filename = getCustomImageFilename(basename); + Bitmap *old_bitmap = *bitmap; + Bitmap *new_bitmap; + + if (filename == NULL) /* (should never happen) */ + { + Error(ERR_WARN, "ReloadCustomImage(): cannot find file '%s'", basename); + return; + } + + if (strcmp(filename, old_bitmap->source_filename) == 0) + { + /* The old and new image are the same (have the same filename and path). + This usually means that this image does not exist in this graphic set + and a fallback to the existing image is done. */ + + return; + } + + if ((new_bitmap = LoadImage(filename)) == NULL) + { + Error(ERR_WARN, "LoadImage() failed: %s", GetError()); + return; + } + + if (old_bitmap->width != new_bitmap->width || + old_bitmap->height != new_bitmap->height) + { + Error(ERR_WARN, "ReloadCustomImage: new image has wrong dimensions"); + FreeBitmap(new_bitmap); + return; + } + + /* copy filename for new image */ + free(old_bitmap->source_filename); + old_bitmap->source_filename = getStringCopy(filename); + + /* copy bitmap data for new image */ + BlitBitmap(new_bitmap, old_bitmap, 0,0, + old_bitmap->width, old_bitmap->height, 0,0); + + FreeBitmap(new_bitmap); +} + /* ========================================================================= */ /* audio functions */ @@ -619,10 +718,10 @@ inline void OpenAudio(void) #if defined(TARGET_SDL) SDLOpenAudio(); -#elif defined(PLATFORM_MSDOS) - MSDOSOpenAudio(); #elif defined(PLATFORM_UNIX) UnixOpenAudio(); +#elif defined(PLATFORM_MSDOS) + MSDOSOpenAudio(); #endif } @@ -630,10 +729,10 @@ inline void CloseAudio(void) { #if defined(TARGET_SDL) SDLCloseAudio(); -#elif defined(PLATFORM_MSDOS) - MSDOSCloseAudio(); #elif defined(PLATFORM_UNIX) UnixCloseAudio(); +#elif defined(PLATFORM_MSDOS) + MSDOSCloseAudio(); #endif audio.sound_enabled = FALSE; @@ -723,9 +822,39 @@ inline boolean CheckCloseWindowEvent(ClientMessageEvent *event) } -inline void dummy(void) +/* ========================================================================= */ +/* joystick functions */ +/* ========================================================================= */ + +inline void InitJoysticks() { -#ifdef TARGET_SDL -#else + int i; + +#ifdef NO_JOYSTICK + return; /* joysticks generally deactivated by compile-time directive */ +#endif + + /* always start with reliable default values */ + joystick.status = JOYSTICK_NOT_AVAILABLE; + for (i=0; i