X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=bc7d5a13c304116bacf57da84c57e721dc069ae5;hb=998be01ad92a672b69b11e24d472f6c0c076817f;hp=a88b78cfdb89630d70a96bd83106fa82ea2250e7;hpb=1465ca1ffdf2104d25b9a46ca9bf8a3f175403fd;p=rocksndiamonds.git diff --git a/src/libgame/system.c b/src/libgame/system.c index a88b78cf..bc7d5a13 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -1,18 +1,27 @@ /*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * +* Artsoft Retro-Game Library * *----------------------------------------------------------* -* ©1995 Artsoft Development * -* Holger Schemel * -* 33659 Bielefeld-Senne * -* Telefon: (0521) 493245 * -* eMail: aeglos@valinor.owl.de * -* aeglos@uni-paderborn.de * -* q99492@pbhrzx.uni-paderborn.de * +* (c) 1994-2000 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * *----------------------------------------------------------* -* system.c * +* system.c * ***********************************************************/ -#include "libgame.h" +#include + +#include "platform.h" + +#if defined(PLATFORM_MSDOS) +#include +#endif + +#include "system.h" +#include "sound.h" +#include "misc.h" /* ========================================================================= */ @@ -23,7 +32,10 @@ struct ProgramInfo program; struct OptionInfo options; struct VideoSystemInfo video; struct AudioSystemInfo audio; -struct PlayfieldInfo playfield; +struct GfxInfo gfx; + +struct LevelDirInfo *leveldir_first = NULL; +struct LevelDirInfo *leveldir_current = NULL; Display *display = NULL; Visual *visual = NULL; @@ -34,23 +46,55 @@ DrawWindow window = NULL; DrawBuffer backbuffer = NULL; DrawBuffer drawto = NULL; -int redraw_mask; -int redraw_tiles; +int button_status = MB_NOT_PRESSED; +boolean motion_status = FALSE; + +int redraw_mask = REDRAW_NONE; +int redraw_tiles = 0; int FrameCounter = 0; /* ========================================================================= */ -/* video functions */ +/* init functions */ /* ========================================================================= */ -inline void InitProgramInfo(char *command_name, char *program_title, - char *window_title, char *icon_title, - char *x11_icon_filename, - char *x11_iconmask_filename, - char *msdos_pointer_filename) +void InitCommandName(char *argv0) +{ + program.command_basename = + (strrchr(argv0, '/') ? strrchr(argv0, '/') + 1 : argv0); +} + +void InitExitFunction(void (*exit_function)(int)) +{ + program.exit_function = exit_function; +} + +void InitPlatformDependantStuff(void) +{ +#if defined(PLATFORM_MSDOS) + _fmode = O_BINARY; +#endif +} + +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) { - program.command_name = command_name; + char *gfx_dir = getPath2(options.ro_base_directory, GRAPHICS_DIRECTORY); + char *x11_icon_filename = getPath2(gfx_dir, x11_icon_basename); + char *x11_iconmask_filename = getPath2(gfx_dir, x11_iconmask_basename); + char *msdos_pointer_filename = getPath2(gfx_dir, msdos_pointer_basename); + + free(gfx_dir); + +#if defined(PLATFORM_UNIX) + program.userdata_directory = unix_userdata_directory; +#else + program.userdata_directory = "userdata"; +#endif + program.program_title = program_title; program.window_title = window_title; program.icon_title = icon_title; @@ -59,44 +103,48 @@ inline void InitProgramInfo(char *command_name, char *program_title, program.msdos_pointer_filename = msdos_pointer_filename; } -inline void InitPlayfieldInfo(int sx, int sy, int sxsize, int sysize, - int real_sx, int real_sy, - int full_sxsize, int full_sysize) +void InitGfxFieldInfo(int sx, int sy, int sxsize, int sysize, + int real_sx, int real_sy, + int full_sxsize, int full_sysize) { - playfield.sx = sx; - playfield.sy = sy; - playfield.sxsize = sxsize; - playfield.sysize = sysize; - playfield.real_sx = real_sx; - playfield.real_sy = real_sy; - playfield.full_sxsize = full_sxsize; - playfield.full_sysize = full_sysize; + gfx.sx = sx; + gfx.sy = sy; + gfx.sxsize = sxsize; + gfx.sysize = sysize; + gfx.real_sx = real_sx; + gfx.real_sy = real_sy; + gfx.full_sxsize = full_sxsize; + gfx.full_sysize = full_sysize; } -inline void InitDoor1Info(int dx, int dy, int dxsize, int dysize) +void InitGfxDoor1Info(int dx, int dy, int dxsize, int dysize) { - playfield.dx = dx; - playfield.dy = dy; - playfield.dxsize = dxsize; - playfield.dysize = dysize; + gfx.dx = dx; + gfx.dy = dy; + gfx.dxsize = dxsize; + gfx.dysize = dysize; } -inline void InitDoor2Info(int vx, int vy, int vxsize, int vysize) +void InitGfxDoor2Info(int vx, int vy, int vxsize, int vysize) { - playfield.vx = vx; - playfield.vy = vy; - playfield.vxsize = vxsize; - playfield.vysize = vysize; + gfx.vx = vx; + gfx.vy = vy; + gfx.vxsize = vxsize; + gfx.vysize = vysize; } -inline void InitScrollbufferInfo(int scrollbuffer_width, - int scrollbuffer_height) +void InitGfxScrollbufferInfo(int scrollbuffer_width, int scrollbuffer_height) { /* currently only used by MSDOS code to alloc VRAM buffer, if available */ - playfield.scrollbuffer_width = scrollbuffer_width; - playfield.scrollbuffer_height = scrollbuffer_height; + gfx.scrollbuffer_width = scrollbuffer_width; + gfx.scrollbuffer_height = scrollbuffer_height; } + +/* ========================================================================= */ +/* video functions */ +/* ========================================================================= */ + inline static int GetRealDepth(int depth) { return (depth == DEFAULT_DEPTH ? video.default_depth : depth); @@ -159,15 +207,20 @@ inline Bitmap CreateBitmap(int width, int height, int depth) #else Pixmap pixmap; - if (!(pixmap = XCreatePixmap(display, window->drawable, - width, height, real_depth))) + if ((pixmap = XCreatePixmap(display, window->drawable, + width, height, real_depth)) + == None) Error(ERR_EXIT, "cannot create pixmap"); + new_bitmap->drawable = pixmap; if (window == NULL) Error(ERR_EXIT, "Window GC needed for Bitmap -- create Window first"); + new_bitmap->gc = window->gc; + new_bitmap->line_gc[0] = window->line_gc[0]; + new_bitmap->line_gc[1] = window->line_gc[1]; #endif return new_bitmap; @@ -291,6 +344,91 @@ inline void DrawSimpleWhiteLine(Bitmap bitmap, int from_x, int from_y, #endif } +#if !defined(TARGET_X11_NATIVE) +inline void DrawLine(Bitmap bitmap, int from_x, int from_y, + int to_x, int to_y, Pixel pixel, int line_width) +{ + int x, y; + + for (x=0; xsurface, + from_x + dx, from_y + dy, to_x + dx, to_y + dy, pixel); +#elif defined(TARGET_ALLEGRO) + AllegroDrawLine(bitmap->drawable, from_x + dx, from_y + dy, + to_x + dx, to_y + dy, pixel); +#endif + } + } +} +#endif + +inline void DrawLines(Bitmap bitmap, struct XY *points, int num_points, + Pixel pixel) +{ +#if !defined(TARGET_X11_NATIVE) + int line_width = 4; + int i; + + for (i=0; isurface, points, num_points, pixel); + */ +#else + XSetForeground(display, bitmap->line_gc[1], pixel); + XDrawLines(display, bitmap->drawable, bitmap->line_gc[1], + (XPoint *)points, num_points, CoordModeOrigin); + /* + XSetForeground(display, gc, BlackPixel(display, screen)); + */ +#endif +} + +inline Pixel GetPixelFromRGB(Bitmap bitmap, unsigned int color_r, + unsigned int color_g, unsigned int color_b) +{ + Pixel pixel; + +#if defined(TARGET_SDL) + pixel = SDL_MapRGB(bitmap->surface->format, color_r, color_g, color_b); +#elif defined(TARGET_X11_NATIVE) + XColor xcolor; + + xcolor.flags = DoRed | DoGreen | DoBlue; + xcolor.red = (color_r << 8); + xcolor.green = (color_g << 8); + xcolor.blue = (color_b << 8); + XAllocColor(display, cmap, &xcolor); + pixel = xcolor.pixel; +#endif + + return pixel; +} + +inline Pixel GetPixelFromRGBcompact(Bitmap bitmap, unsigned int color) +{ + unsigned int color_r = (color >> 16) & 0xff; + unsigned int color_g = (color >> 8) & 0xff; + unsigned int color_b = (color >> 0) & 0xff; + + return GetPixelFromRGB(bitmap, color_r, color_g, color_b); +} + /* execute all pending screen drawing operations */ inline void FlushDisplay(void) { @@ -386,6 +524,7 @@ inline boolean OpenAudio(struct AudioSystemInfo *audio) { audio->sound_available = FALSE; audio->loops_available = FALSE; + audio->sound_enabled = FALSE; audio->soundserver_pipe[0] = audio->soundserver_pipe[1] = 0; audio->soundserver_pid = 0; audio->device_name = NULL; @@ -396,12 +535,14 @@ inline boolean OpenAudio(struct AudioSystemInfo *audio) { audio->sound_available = TRUE; audio->loops_available = TRUE; + audio->sound_enabled = TRUE; } #elif defined(PLATFORM_MSDOS) if (MSDOSOpenAudio()) { audio->sound_available = TRUE; audio->loops_available = TRUE; + audio->sound_enabled = TRUE; } #elif defined(PLATFORM_UNIX) UnixOpenAudio(audio); @@ -422,6 +563,15 @@ inline void CloseAudio(struct AudioSystemInfo *audio) audio->sound_available = FALSE; audio->loops_available = FALSE; + audio->sound_enabled = FALSE; +} + +inline void SetAudioMode(boolean enabled) +{ + if (!audio.sound_available) + return; + + audio.sound_enabled = enabled; }