X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=eff8576cf417ccf793b11304a209ebe58cf32b80;hb=ff56a43aa3799aa3357f4deca4d6482fc25a6a41;hp=a88b78cfdb89630d70a96bd83106fa82ea2250e7;hpb=1465ca1ffdf2104d25b9a46ca9bf8a3f175403fd;p=rocksndiamonds.git diff --git a/src/libgame/system.c b/src/libgame/system.c index a88b78cf..eff8576c 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); @@ -386,6 +434,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 +445,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 +473,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; }