X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=2ddbbcd5769c56c30cadc67d8092fc3fefb3f9f2;hb=fe158e864d3fa4b0221e9c88d8dfff0157051396;hp=0f0bd65234873a2ea12c2877b54c65b68c810924;hpb=cf5b3a1e9077e88eb40ce2fb59e985a0ae037c84;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 0f0bd652..2ddbbcd5 100644 --- a/src/init.c +++ b/src/init.c @@ -1,600 +1,413 @@ /*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * +* Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* ©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) 1995-2001 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * *----------------------------------------------------------* -* init.c * +* init.c * ***********************************************************/ +#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 "gfxloader.h" - -#include - -#ifdef DEBUG -/* -#define DEBUG_TIMING -*/ -#endif +#include "network.h" +#include "netserv.h" -struct PictureFileInfo +static char *image_filename[NUM_PICTURES] = { - char *picture_filename; - BOOL picture_with_mask; -}; - -struct IconFileInfo -{ - char *picture_filename; - char *picturemask_filename; -}; - -static int sound_process_id = 0; - -static void InitLevelAndPlayerInfo(void); -static void InitDisplay(int, char **); + "RocksScreen.pcx", + "RocksDoor.pcx", + "RocksHeroes.pcx", + "RocksToons.pcx", + "RocksSP.pcx", + "RocksDC.pcx", + "RocksMore.pcx", + "RocksFont.pcx", + "RocksFont2.pcx", + "RocksFont3.pcx" +}; + +static void InitPlayerInfo(void); +static void InitSetup(void); +static void InitLevelInfo(void); +static void InitNetworkServer(void); static void InitSound(void); -static void InitSoundProcess(void); -static void InitWindow(int, char **); static void InitGfx(void); -static void LoadGfx(int, struct PictureFileInfo *); +static void InitCustomGraphics(void); +static void InitGfxBackground(void); +static void InitGadgets(void); static void InitElementProperties(void); -void OpenAll(int argc, char *argv[]) +void OpenAll(void) { - InitLevelAndPlayerInfo(); + if (options.serveronly) + { +#if defined(PLATFORM_UNIX) + NetworkServer(options.server_port, options.serveronly); +#else + Error(ERR_WARN, "networking only supported in Unix version"); +#endif + exit(0); /* never reached */ + } + + InitProgramInfo(UNIX_USERDATA_DIRECTORY, + PROGRAM_TITLE_STRING, WINDOW_TITLE_STRING, + ICON_TITLE_STRING, X11_ICON_FILENAME, X11_ICONMASK_FILENAME, + MSDOS_POINTER_FILENAME, + COOKIE_PREFIX, FILENAME_PREFIX, GAME_VERSION_ACTUAL); + + InitSetup(); + InitPlayerInfo(); InitCounter(); InitSound(); - InitSoundProcess(); - InitJoystick(); + InitJoysticks(); InitRND(NEW_RANDOMIZE); - signal(SIGINT, CloseAll); - signal(SIGTERM, CloseAll); - - InitDisplay(argc, argv); - InitWindow(argc, argv); + InitVideoDisplay(); + InitVideoBuffer(&backbuffer, &window, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, + setup.fullscreen); - XMapWindow(display, window); - XFlush(display); + InitEventFilter(FilterMouseMotionEvents); InitGfx(); - InitElementProperties(); + InitElementProperties(); /* initializes IS_CHAR() for el2gfx() */ + + InitLevelInfo(); + InitGadgets(); /* needs to know number of level series */ + + InitCustomGraphics(); + InitGfxBackground(); DrawMainMenu(); + + InitNetworkServer(); } -void InitLevelAndPlayerInfo() +void InitSetup() { - if (!LoadLevelInfo()) /* global level info */ - CloseAll(); - - LoadPlayerInfo(PLAYER_SETUP); /* global setup info */ - LoadPlayerInfo(PLAYER_LEVEL); /* level specific info */ + LoadSetup(); /* global setup info */ } -void InitSound() +void InitPlayerInfo() { int i; - if (sound_status==SOUND_OFF) - return; - - if (access(sound_device_name,W_OK)<0) - { - fprintf(stderr,"%s: cannot access sound device - no sounds\n",progname); - sound_status=SOUND_OFF; - return; - } - - if ((sound_device=open(sound_device_name,O_WRONLY))<0) - { - fprintf(stderr,"%s: cannot open sound device - no sounds\n",progname); - sound_status=SOUND_OFF; - return; - } + /* choose default local player */ + local_player = &stored_player[0]; - close(sound_device); - sound_status=SOUND_AVAILABLE; + for (i=0; iconnected = TRUE; } -void InitSoundProcess() +void InitLevelInfo() { - if (sound_status==SOUND_OFF) - return; - - if (pipe(sound_pipe)<0) - { - fprintf(stderr,"%s: cannot create pipe - no sounds\n",progname); - sound_status=SOUND_OFF; - return; - } - - if ((sound_process_id=fork())<0) - { - fprintf(stderr,"%s: cannot create child process - no sounds\n",progname); - sound_status=SOUND_OFF; - return; - } - - if (!sound_process_id) /* we are child */ - SoundServer(); - else /* we are parent */ - close(sound_pipe[0]); /* no reading from pipe needed */ + LoadLevelInfo(); /* global level info */ + LoadLevelSetup_LastSeries(); /* last played series info */ + LoadLevelSetup_SeriesInfo(); /* last played level info */ } -void InitJoystick() +void InitNetworkServer() { - if (global_joystick_status==JOYSTICK_OFF) - return; +#if defined(PLATFORM_UNIX) + int nr_wanted; +#endif - if (access(joystick_device_name[joystick_nr],R_OK)<0) - { - fprintf(stderr,"%s: cannot access joystick device '%s'\n", - progname,joystick_device_name[joystick_nr]); - joystick_status = JOYSTICK_OFF; + if (!options.network) return; - } - if ((joystick_device=open(joystick_device_name[joystick_nr],O_RDONLY))<0) - { - fprintf(stderr,"%s: cannot open joystick device '%s'\n", - progname,joystick_device_name[joystick_nr]); - joystick_status = JOYSTICK_OFF; - return; - } +#if defined(PLATFORM_UNIX) + nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED); - joystick_status = JOYSTICK_AVAILABLE; - LoadJoystickData(); + if (!ConnectToServer(options.server_host, options.server_port)) + Error(ERR_EXIT, "cannot connect to network game server"); + + SendToServer_PlayerName(setup.player_name); + SendToServer_ProtocolVersion(); + + if (nr_wanted) + SendToServer_NrWanted(nr_wanted); +#endif } -void InitDisplay(int argc, char *argv[]) +void InitSound() { - char *display_name = NULL; int i; - /* get X server to connect to, if given as an argument */ - for (i=1;iclip_mask, + clip_gc_valuemask, &clip_gc_values); + + clip_gc_values.graphics_exposures = False; + clip_gc_valuemask = GCGraphicsExposures; + tile_clip_gc = + XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values); + + 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 (!XStringListToTextProperty(&icon_name, 1, &iconName)) +#if defined(TARGET_X11_NATIVE) + /* create only those clipping Pixmaps we really need */ + for(i=0; tile_needs_clipping[i].start>=0; i++) { - fprintf(stderr, "%s: structure allocation for iconName failed.\n", - progname); - exit(-1); - } + int j; - 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 = progname; - class_hints.res_class = "Rocks'n'Diamonds"; - - 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 | ButtonMotionMask | - KeyPressMask | KeyReleaseMask; - XSelectInput(display, window, window_event_mask); - - /* 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); -} + for(j=0; jclip_mask; + + tile_clipmask[tile] = XCreatePixmap(display, window->drawable, + TILEX, TILEY, 1); + + XCopyArea(display, src_pixmap, tile_clipmask[tile], copy_clipmask_gc, + src_x, src_y, TILEX, TILEY, 0, 0); + } } +#endif /* TARGET_X11_NATIVE */ +#endif /* TARGET_X11 */ } void InitGfx() { - int i,j; - XGCValues clip_gc_values; - unsigned long clip_gc_valuemask; - static struct PictureFileInfo pic[NUM_PICTURES] = - { - { "RocksScreen", TRUE }, - { "RocksDoor", TRUE }, - { "RocksHeroes", TRUE }, - { "RocksToons", TRUE }, - { "RocksFont", FALSE }, - { "RocksFont2", FALSE } - }; - -#ifdef DEBUG_TIMING - long count1, count2; - count1 = Counter(); -#endif + int i; - LoadGfx(PIX_SMALLFONT,&pic[PIX_SMALLFONT]); - DrawInitText(WINDOWTITLE_STRING,20,FC_YELLOW); - DrawInitText(COPYRIGHT_STRING,50,FC_RED); - DrawInitText("Loading graphics:",120,FC_GREEN); + /* initialize some global variables */ + global.frames_per_second = 0; + global.fps_slowdown = FALSE; + global.fps_slowdown_factor = 1; - for(i=0;ipicture_filename) + for(i=0; ipicture_filename,picture_ext); - DrawInitText(basefilename,150,FC_YELLOW); - sprintf(filename,"%s/%s",GFX_PATH,basefilename); - -#ifdef DEBUG_TIMING - count1 = Counter(); + Bitmap *new_pic = + pix_custom[i] = LoadImage(image_filename[i]); + } #endif +} -#ifdef XPM_INCLUDE_FILE - - 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: - fprintf(stderr,"Cannot open Xpm file '%s' !\n",filename); - CloseAll(); - exit(-1); - case XpmFileInvalid: - fprintf(stderr,"Invalid Xpm file '%s'!\n",filename); - CloseAll(); - exit(-1); - case XpmNoMemory: - fprintf(stderr,"Not enough memory for Xpm file '%s'!\n",filename); - CloseAll(); - exit(1); - case XpmColorFailed: - fprintf(stderr,"Can't get colors for Xpm file '%s'!\n",filename); - CloseAll(); - exit(-1); - default: - break; - } +void InitCustomGraphics() +{ +#if 0 + static char *filename = NULL; -#else + /* look for optional directory ~/./graphics */ + filename = getPath2(getUserDataDir(), GRAPHICS_DIRECTORY); + if (access(dir, F_OK) == 0) + { + } - gif_err = Read_GIF_to_Pixmap(display,filename,&pix[pos]); - switch(gif_err) - { - case GIF_Success: - break; - case GIF_OpenFailed: - fprintf(stderr,"Cannot open GIF file '%s' !\n",filename); - CloseAll(); - exit(-1); - case GIF_ReadFailed: - fprintf(stderr,"Cannot read GIF file '%s' !\n",filename); - CloseAll(); - exit(-1); - case GIF_FileInvalid: - fprintf(stderr,"Invalid GIF file '%s'!\n",filename); - CloseAll(); - exit(-1); - case GIF_NoMemory: - fprintf(stderr,"Not enough memory for GIF file '%s'!\n",filename); - CloseAll(); - exit(1); - case GIF_ColorFailed: - fprintf(stderr,"Can't get colors for GIF file '%s'!\n",filename); - CloseAll(); - exit(-1); - default: - break; - } -#endif -#ifdef DEBUG_TIMING - count2 = Counter(); - printf("LOADING %s IN %.2f SECONDS\n", - filename,(float)(count2-count1)/100.0); -#endif +(leveldir_current->user_defined ? + getUserLevelDir("") : + options.level_directory), + leveldir_current->fullpath, + basename); - if (!pix[pos]) - { - fprintf(stderr, "%s: cannot read graphics file '%s'.\n", - progname,filename); - CloseAll(); - exit(-1); - } - } - /* zugehörige Maske laden (wenn vorhanden) */ - if (pic->picture_with_mask) - { - sprintf(basefilename,"%s%s",pic->picture_filename,picturemask_ext); - DrawInitText(basefilename,150,FC_YELLOW); - sprintf(filename,"%s/%s",GFX_PATH,basefilename); -#ifdef DEBUG_TIMING - count1 = Counter(); + filename = getPath3((leveldir_current->user_defined ? + getUserLevelDir("") : + options.level_directory), + leveldir_current->fullpath, + basename); #endif +} -#ifdef XPM_INCLUDE_FILE - - xbm_err = XReadBitmapFile(display,window,filename, - &width,&height,&clipmask[pos],&hot_x,&hot_y); - switch(xbm_err) - { - case BitmapSuccess: - break; - case BitmapOpenFailed: - fprintf(stderr,"Bitmap file open failed on '%s' !\n",filename); - CloseAll(); - exit(-1); - break; - case BitmapFileInvalid: - fprintf(stderr,"Bitmap file invalid: '%s' !\n",filename); - CloseAll(); - exit(-1); - break; - case BitmapNoMemory: - fprintf(stderr,"No memory for file '%s' !\n",filename); - CloseAll(); - exit(-1); - break; - default: - break; - } - -#else - - ilbm_err = Read_ILBM_to_Bitmap(display,filename,&clipmask[pos]); +void InitGfxBackground() +{ + int x, y; - switch(ilbm_err) - { - case ILBM_Success: - break; - case ILBM_OpenFailed: - fprintf(stderr,"Cannot open ILBM file '%s' !\n",filename); - CloseAll(); - exit(-1); - case ILBM_ReadFailed: - fprintf(stderr,"Cannot read ILBM file '%s' !\n",filename); - CloseAll(); - exit(-1); - case ILBM_FileInvalid: - fprintf(stderr,"Invalid ILBM file '%s'!\n",filename); - CloseAll(); - exit(-1); - case ILBM_NoMemory: - fprintf(stderr,"Not enough memory for ILBM file '%s'!\n",filename); - CloseAll(); - exit(1); - default: - break; - } + drawto = backbuffer; + fieldbuffer = pix[PIX_DB_FIELD]; + SetDrawtoField(DRAW_BACKBUFFER); -#endif + 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); -#ifdef DEBUG_TIMING - count2 = Counter(); - printf("LOADING %s IN %.2f SECONDS\n", - filename,(float)(count2-count1)/100.0); -#endif + for(x=0; x