X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Finit.c;h=fe585257360fc68d0dc3785be8dbf0f4761013b4;hp=dcd822443f976931102c8c6d8c6ef5af084207b4;hb=bcb3453f710b95ec98b188b95574bea9ab336e96;hpb=0c27626bae90cb1eeea4939de0130a49b9aac507 diff --git a/src/init.c b/src/init.c index dcd82244..fe585257 100644 --- a/src/init.c +++ b/src/init.c @@ -1,95 +1,109 @@ /*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * +* Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-98 Artsoft Entertainment * -* Holger Schemel * -* Oststrasse 11a * -* 33604 Bielefeld * -* phone: ++49 +521 290471 * -* email: aeglos@valinor.owl.de * +* (c) 1995-2001 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * *----------------------------------------------------------* -* init.c * +* init.c * ***********************************************************/ -#include +#include "libgame/libgame.h" #include "init.h" -#include "misc.h" -#include "sound.h" +#include "events.h" #include "screens.h" #include "editor.h" #include "game.h" #include "tape.h" #include "tools.h" #include "files.h" -#include "joystick.h" -#include "image.h" -#include "pcx.h" #include "network.h" #include "netserv.h" +#include "cartoons.h" +#include "config.h" -struct PictureFileInfo +static char *image_filename[NUM_PICTURES] = { - char *picture_filename; - boolean picture_with_mask; -}; - -struct IconFileInfo -{ - char *picture_filename; - char *picturemask_filename; -}; - -static int sound_process_id = 0; - -static void InitLevelAndPlayerInfo(void); + "RocksScreen.pcx", + "RocksDoor.pcx", + "RocksHeroes.pcx", + "RocksToons.pcx", + "RocksSP.pcx", + "RocksDC.pcx", + "RocksMore.pcx", + "RocksFont.pcx", + "RocksFont2.pcx", + "RocksFont3.pcx" +}; + +static void InitSetup(void); +static void InitPlayerInfo(void); +static void InitLevelInfo(void); +static void InitArtworkInfo(void); static void InitNetworkServer(void); -static void InitDisplay(void); static void InitSound(void); -static void InitSoundServer(void); -static void InitWindow(int, char **); static void InitGfx(void); -static void LoadGfx(int, struct PictureFileInfo *); +static void InitGfxBackground(void); static void InitGadgets(void); static void InitElementProperties(void); -void OpenAll(int argc, char *argv[]) +void OpenAll(void) { if (options.serveronly) { +#if defined(PLATFORM_UNIX) NetworkServer(options.server_port, options.serveronly); - - /* never reached */ - exit(0); +#else + Error(ERR_WARN, "networking only supported in Unix version"); +#endif + exit(0); /* never reached */ } - InitLevelAndPlayerInfo(); + InitProgramInfo(UNIX_USERDATA_DIRECTORY, + PROGRAM_TITLE_STRING, getWindowTitleString(), + ICON_TITLE_STRING, X11_ICON_FILENAME, X11_ICONMASK_FILENAME, + MSDOS_POINTER_FILENAME, + COOKIE_PREFIX, FILENAME_PREFIX, GAME_VERSION_ACTUAL); + + InitSetup(); + InitPlayerInfo(); InitCounter(); InitSound(); - InitSoundServer(); InitJoysticks(); InitRND(NEW_RANDOMIZE); - signal(SIGINT, CloseAllAndExit); - signal(SIGTERM, CloseAllAndExit); - - InitDisplay(); - InitWindow(argc, argv); + InitVideoDisplay(); + InitVideoBuffer(&backbuffer, &window, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, + setup.fullscreen); - XMapWindow(display, window); - XFlush(display); + InitEventFilter(FilterMouseMotionEvents); + InitArtworkInfo(); InitGfx(); - InitElementProperties(); - InitGadgets(); + InitElementProperties(); /* initializes IS_CHAR() for el2gfx() */ + + InitLevelInfo(); + InitGadgets(); /* needs to know number of level series */ + + InitGfxBackground(); + InitToons(); DrawMainMenu(); InitNetworkServer(); } -void InitLevelAndPlayerInfo() +void InitSetup() +{ + LoadSetup(); /* global setup info */ +} + +void InitPlayerInfo() { int i; @@ -97,28 +111,33 @@ void InitLevelAndPlayerInfo() local_player = &stored_player[0]; for (i=0; iconnected = TRUE; +} - LoadLevelInfo(); /* global level info */ - LoadSetup(); /* global setup info */ - LoadLevelSetup(); /* info about last played level */ +void InitLevelInfo() +{ + LoadLevelInfo(); /* global level info */ + LoadLevelSetup_LastSeries(); /* last played series info */ + LoadLevelSetup_SeriesInfo(); /* last played level info */ +} + +void InitArtworkInfo() +{ + LoadArtworkInfo(); } void InitNetworkServer() { -#ifndef MSDOS +#if defined(PLATFORM_UNIX) int nr_wanted; #endif if (!options.network) return; -#ifndef MSDOS +#if defined(PLATFORM_UNIX) nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED); if (!ConnectToServer(options.server_host, options.server_port)) @@ -136,382 +155,34 @@ void InitSound() { int i; - if (sound_status == SOUND_OFF) - return; - -#ifndef MSDOS - if (access(sound_device_name, W_OK) != 0) - { - Error(ERR_WARN, "cannot access sound device - no sounds"); - sound_status = SOUND_OFF; - return; - } - - if ((sound_device = open(sound_device_name,O_WRONLY))<0) - { - Error(ERR_WARN, "cannot open sound device - no sounds"); - sound_status = SOUND_OFF; - return; - } - - close(sound_device); - sound_status = SOUND_AVAILABLE; - -#ifdef VOXWARE - sound_loops_allowed = TRUE; - - /* - setup.sound_loops_on = TRUE; - */ - -#endif -#else /* MSDOS */ - sound_loops_allowed = TRUE; - - /* - setup.sound_loops_on = TRUE; - */ - -#endif /* MSDOS */ + OpenAudio(); for(i=0; i= num_joysticks) - joystick_nr = -1; - - /* misuse joystick file descriptor variable to store joystick number */ - stored_player[i].joystick_fd = joystick_nr; - } -#endif -} - -void InitDisplay() -{ -#ifndef MSDOS - XVisualInfo vinfo_template, *vinfo; - int num_visuals; -#endif - unsigned int depth; - - /* connect to X server */ - if (!(display = XOpenDisplay(options.display_name))) - Error(ERR_EXIT, "cannot connect to X server %s", - XDisplayName(options.display_name)); - - screen = DefaultScreen(display); - visual = DefaultVisual(display, screen); - depth = DefaultDepth(display, screen); - cmap = DefaultColormap(display, screen); - -#ifndef MSDOS - /* look for good enough visual */ - vinfo_template.screen = screen; - vinfo_template.class = (depth == 8 ? PseudoColor : TrueColor); - vinfo_template.depth = depth; - if ((vinfo = XGetVisualInfo(display, VisualScreenMask | VisualClassMask | - VisualDepthMask, &vinfo_template, &num_visuals))) - { - visual = vinfo->visual; - XFree((void *)vinfo); - } - - /* got appropriate visual? */ - if (depth < 8) - { - printf("Sorry, displays with less than 8 bits per pixel not supported.\n"); - exit(-1); - } - else if ((depth ==8 && visual->class != PseudoColor) || - (depth > 8 && visual->class != TrueColor && - visual->class != DirectColor)) - { - printf("Sorry, cannot get appropriate visual.\n"); - exit(-1); } -#endif -} - -void InitWindow(int argc, char *argv[]) -{ - unsigned int border_width = 4; - XGCValues gc_values; - unsigned long gc_valuemask; -#ifndef MSDOS - XTextProperty windowName, iconName; - Pixmap icon_pixmap, iconmask_pixmap; - unsigned int icon_width, icon_height; - int icon_hot_x, icon_hot_y; - char icon_filename[256]; - XSizeHints size_hints; - XWMHints wm_hints; - XClassHint class_hints; - char *window_name = WINDOW_TITLE_STRING; - char *icon_name = WINDOW_TITLE_STRING; - long window_event_mask; - Atom proto_atom = None, delete_atom = None; -#endif - int screen_width, screen_height; - int win_xpos = WIN_XPOS, win_ypos = WIN_YPOS; - unsigned long pen_fg = WhitePixel(display,screen); - unsigned long pen_bg = BlackPixel(display,screen); - const int width = WIN_XSIZE, height = WIN_YSIZE; - -#ifndef MSDOS - static struct IconFileInfo icon_pic = - { - "rocks_icon.xbm", - "rocks_iconmask.xbm" - }; -#endif - - screen_width = XDisplayWidth(display, screen); - screen_height = XDisplayHeight(display, screen); - - win_xpos = (screen_width - width) / 2; - win_ypos = (screen_height - height) / 2; - - window = XCreateSimpleWindow(display, RootWindow(display, screen), - win_xpos, win_ypos, width, height, border_width, - pen_fg, pen_bg); - -#ifndef MSDOS - proto_atom = XInternAtom(display, "WM_PROTOCOLS", FALSE); - delete_atom = XInternAtom(display, "WM_DELETE_WINDOW", FALSE); - if ((proto_atom != None) && (delete_atom != None)) - XChangeProperty(display, window, proto_atom, XA_ATOM, 32, - PropModePrepend, (unsigned char *) &delete_atom, 1); - - sprintf(icon_filename, "%s/%s/%s", - options.ro_base_directory, GRAPHICS_DIRECTORY, - icon_pic.picture_filename); - XReadBitmapFile(display,window,icon_filename, - &icon_width,&icon_height, - &icon_pixmap,&icon_hot_x,&icon_hot_y); - if (!icon_pixmap) - Error(ERR_EXIT, "cannot read icon bitmap file '%s'", icon_filename); - - sprintf(icon_filename, "%s/%s/%s", - options.ro_base_directory, GRAPHICS_DIRECTORY, - icon_pic.picturemask_filename); - XReadBitmapFile(display,window,icon_filename, - &icon_width,&icon_height, - &iconmask_pixmap,&icon_hot_x,&icon_hot_y); - if (!iconmask_pixmap) - Error(ERR_EXIT, "cannot read icon bitmap file '%s'", icon_filename); - - size_hints.width = size_hints.min_width = size_hints.max_width = width; - size_hints.height = size_hints.min_height = size_hints.max_height = height; - size_hints.flags = PSize | PMinSize | PMaxSize; - - if (win_xpos || win_ypos) - { - size_hints.x = win_xpos; - size_hints.y = win_ypos; - size_hints.flags |= PPosition; - } - - if (!XStringListToTextProperty(&window_name, 1, &windowName)) - Error(ERR_EXIT, "structure allocation for windowName failed"); - - if (!XStringListToTextProperty(&icon_name, 1, &iconName)) - Error(ERR_EXIT, "structure allocation for iconName failed"); - - wm_hints.initial_state = NormalState; - wm_hints.input = True; - wm_hints.icon_pixmap = icon_pixmap; - wm_hints.icon_mask = iconmask_pixmap; - wm_hints.flags = StateHint | IconPixmapHint | IconMaskHint | InputHint; - class_hints.res_name = program_name; - class_hints.res_class = "Rocks'n'Diamonds"; + num_bg_loops = LoadMusic(); - XSetWMProperties(display, window, &windowName, &iconName, - argv, argc, &size_hints, &wm_hints, - &class_hints); - - XFree(windowName.value); - XFree(iconName.value); - - /* Select event types wanted */ - window_event_mask = - ExposureMask | StructureNotifyMask | FocusChangeMask | - ButtonPressMask | ButtonReleaseMask | PointerMotionMask | - PointerMotionHintMask | KeyPressMask | KeyReleaseMask; - - XSelectInput(display, window, window_event_mask); -#endif - - /* create GC for drawing with window depth */ - gc_values.graphics_exposures = False; - gc_values.foreground = pen_bg; - gc_values.background = pen_bg; - gc_valuemask = GCGraphicsExposures | GCForeground | GCBackground; - gc = XCreateGC(display, window, gc_valuemask, &gc_values); -} - -void DrawInitText(char *text, int ypos, int color) -{ - if (display && window && pix[PIX_SMALLFONT]) - { - XFillRectangle(display,window,gc,0,ypos, WIN_XSIZE,FONT2_YSIZE); - DrawTextExt(window,gc,(WIN_XSIZE-strlen(text)*FONT2_XSIZE)/2, - ypos,text,FS_SMALL,color); - XFlush(display); - } + StartSoundserver(); } -void InitGfx() +void InitTileClipmasks() { - int i,j; +#if defined(TARGET_X11) GC copy_clipmask_gc; XGCValues clip_gc_values; unsigned long clip_gc_valuemask; - -#ifdef MSDOS - static struct PictureFileInfo pic[NUM_PICTURES] = - { - { "Screen", TRUE }, - { "Door", TRUE }, - { "Heroes", TRUE }, - { "Toons", TRUE }, - { "More", TRUE }, - { "Font", FALSE }, - { "Font2", FALSE } - }; -#else - static struct PictureFileInfo pic[NUM_PICTURES] = - { - { "RocksScreen", TRUE }, - { "RocksDoor", TRUE }, - { "RocksHeroes", TRUE }, - { "RocksToons", TRUE }, - { "RocksMore", TRUE }, - { "RocksFont", FALSE }, - { "RocksFont2", FALSE } - }; -#endif - -#ifdef DEBUG -#if 0 - static struct PictureFileInfo test_pic1 = - { - "RocksFont2", - FALSE - }; - static struct PictureFileInfo test_pic2 = - { - "mouse", - FALSE - }; -#endif #endif +#if defined(TARGET_X11_NATIVE) static struct { int start; @@ -559,70 +230,54 @@ void InitGfx() { GFX_SOKOBAN_OBJEKT, 1 }, { GFX_FUNKELN_BLAU, 3 }, { GFX_FUNKELN_WEISS, 3 }, + { GFX2_SHIELD_PASSIVE, 3 }, + { GFX2_SHIELD_ACTIVE, 3 }, { -1, 0 } }; - -#if DEBUG_TIMING - debug_print_timestamp(0, NULL); /* initialize timestamp function */ #endif -#ifdef DEBUG -#if 0 - printf("Test: Loading RocksFont2.pcx ...\n"); - LoadGfx(PIX_SMALLFONT,&test_pic1); - printf("Test: Done.\n"); - printf("Test: Loading mouse.pcx ...\n"); - LoadGfx(PIX_SMALLFONT,&test_pic2); - printf("Test: Done.\n"); -#endif -#endif - - - - LoadGfx(PIX_SMALLFONT,&pic[PIX_SMALLFONT]); - DrawInitText(WINDOW_TITLE_STRING,20,FC_YELLOW); - DrawInitText(COPYRIGHT_STRING,50,FC_RED); -#ifdef MSDOS - DrawInitText("MSDOS version done by Guido Schulz",210,FC_BLUE); - rest(200); -#endif /* MSDOS */ - DrawInitText("Loading graphics:",120,FC_GREEN); - - for(i=0; iclip_mask, + clip_gc_valuemask, &clip_gc_values); clip_gc_values.graphics_exposures = False; clip_gc_valuemask = GCGraphicsExposures; tile_clip_gc = - XCreateGC(display,window,clip_gc_valuemask,&clip_gc_values); + XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values); - /* initialize pixmap array to Pixmap 'None' */ - for(i=0; iclip_mask) + { + clip_gc_values.graphics_exposures = False; + clip_gc_values.clip_mask = pix[i]->clip_mask; + clip_gc_valuemask = GCGraphicsExposures | GCClipMask; + pix[i]->stored_clip_gc = XCreateGC(display, window->drawable, + clip_gc_valuemask,&clip_gc_values); + } + } +#if defined(TARGET_X11_NATIVE) /* create only those clipping Pixmaps we really need */ for(i=0; tile_needs_clipping[i].start>=0; i++) { + int j; + for(j=0; jclip_mask; - if (!pix[PIX_DB_BACK] || !pix[PIX_DB_DOOR]) - Error(ERR_EXIT, "cannot create additional pixmaps"); + tile_clipmask[tile] = XCreatePixmap(display, window->drawable, + TILEX, TILEY, 1); - for(i=0; ipicture_filename) - { - sprintf(basefilename, "%s%s", pic->picture_filename, picture_ext); - DrawInitText(basefilename, 150, FC_YELLOW); - sprintf(filename, "%s/%s/%s", - options.ro_base_directory, GRAPHICS_DIRECTORY, basefilename); + /* initialize some global variables */ + global.frames_per_second = 0; + global.fps_slowdown = FALSE; + global.fps_slowdown_factor = 1; -#ifdef MSDOS - rest(100); -#endif /* MSDOS */ + /* initialize screen properties */ + InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); + InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE); + InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE); + InitGfxScrollbufferInfo(FXSIZE, FYSIZE); -#if DEBUG_TIMING - debug_print_timestamp(1, NULL); /* initialize timestamp function */ -#endif + /* create additional image buffers for double-buffering */ + pix[PIX_DB_DOOR] = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH); + pix[PIX_DB_FIELD] = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH); -#ifdef USE_XPM_LIBRARY + pix[PIX_SMALLFONT] = LoadCustomImage(image_filename[PIX_SMALLFONT]); - xpm_att[pos].valuemask = XpmCloseness; - xpm_att[pos].closeness = 20000; - xpm_err = XpmReadFileToPixmap(display,window,filename, - &pix[pos],&shapemask,&xpm_att[pos]); - switch(xpm_err) - { - case XpmOpenFailed: - Error(ERR_EXIT, "cannot open XPM file '%s'", filename); - case XpmFileInvalid: - Error(ERR_EXIT, "invalid XPM file '%s'", filename); - case XpmNoMemory: - Error(ERR_EXIT, "not enough memory for XPM file '%s'", filename); - case XpmColorFailed: - Error(ERR_EXIT, "cannot get colors for XPM file '%s'", filename); - default: - break; - } + InitFontInfo(NULL, NULL, pix[PIX_SMALLFONT]); -#if DEBUG_TIMING - printf("LOADING XPM FILE %s:", filename); - debug_print_timestamp(1, ""); + DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW); + DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED); +#if defined(PLATFORM_MSDOS) + DrawInitText(PROGRAM_DOS_PORT_STRING, 210, FC_BLUE); + rest(200); #endif + DrawInitText("Loading graphics:",120,FC_GREEN); -#else /* !USE_XPM_LIBRARY */ - - pcx_err = Read_PCX_to_Pixmap(display, window, gc, filename, - &pix[pos], &clipmask[pos]); - switch(pcx_err) + for(i=0; ipicture_filename); + pix[i] = LoadCustomImage(image_filename[i]); + } } - /* zugehörige Maske laden (wenn vorhanden) */ - if (pic->picture_with_mask) - { -#ifdef USE_XPM_LIBRARY + InitFontInfo(pix[PIX_BIGFONT], pix[PIX_MEDIUMFONT], pix[PIX_SMALLFONT]); - sprintf(basefilename, "%s%s", pic->picture_filename, picturemask_ext); - DrawInitText(basefilename, 150, FC_YELLOW); - sprintf(filename, "%s/%s/%s", - options.ro_base_directory, GRAPHICS_DIRECTORY, basefilename); - -#if DEBUG_TIMING - debug_print_timestamp(1, NULL); /* initialize timestamp function */ -#endif + InitTileClipmasks(); +} - xbm_err = XReadBitmapFile(display,window,filename, - &width,&height,&clipmask[pos],&hot_x,&hot_y); - switch(xbm_err) - { - case BitmapSuccess: - break; - case BitmapOpenFailed: - Error(ERR_EXIT, "cannot open XBM file '%s'", filename); - case BitmapFileInvalid: - Error(ERR_EXIT, "invalid XBM file '%s'", filename); - case BitmapNoMemory: - Error(ERR_EXIT, "not enough memory for XBM file '%s'", filename); - break; - default: - break; - } +void InitGfxBackground() +{ + int x, y; -#if DEBUG_TIMING - printf("LOADING XBM FILE %s:", filename); - debug_print_timestamp(1, ""); -#endif + drawto = backbuffer; + fieldbuffer = pix[PIX_DB_FIELD]; + SetDrawtoField(DRAW_BACKBUFFER); -#endif /* USE_XPM_LIBRARY */ + BlitBitmap(pix[PIX_BACK], backbuffer, 0,0, WIN_XSIZE,WIN_YSIZE, 0,0); + ClearRectangle(backbuffer, REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE); + ClearRectangle(pix[PIX_DB_DOOR], 0,0, 3*DXSIZE,DYSIZE+VYSIZE); - if (!clipmask[pos]) - Error(ERR_EXIT, "cannot get clipmask for '%s'", pic->picture_filename); - } + for(x=0; x