rnd-19981005-1
[rocksndiamonds.git] / src / init.c
index 4181eb00cb58737be9d121288400b7d6c5d4d0c3..0a0c7580c460bd184622b944a91fb6e14d09b052 100644 (file)
@@ -1,17 +1,18 @@
 /***********************************************************
 *  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-98 Artsoft Entertainment                       *
+*              Holger Schemel                              *
+*              Oststrasse 11a                              *
+*              33604 Bielefeld                             *
+*              phone: ++49 +521 290471                     *
+*              email: aeglos@valinor.owl.de                *
 *----------------------------------------------------------*
 *  init.c                                                  *
 ***********************************************************/
 
+#include <signal.h>
+
 #include "init.h"
 #include "misc.h"
 #include "sound.h"
@@ -21,8 +22,7 @@
 #include "joystick.h"
 #include "gfxload.h"
 #include "gifload.h"
-
-#include <signal.h>
+#include "network.h"
 
 #ifdef DEBUG
 /*
@@ -45,9 +45,10 @@ struct IconFileInfo
 static int sound_process_id = 0;
 
 static void InitLevelAndPlayerInfo(void);
-static void InitDisplay(int, char **);
+static void InitNetworkServer(void);
+static void InitDisplay(void);
 static void InitSound(void);
-static void InitSoundProcess(void);
+static void InitSoundServer(void);
 static void InitWindow(int, char **);
 static void InitGfx(void);
 static void LoadGfx(int, struct PictureFileInfo *);
@@ -59,14 +60,14 @@ void OpenAll(int argc, char *argv[])
 
   InitCounter();
   InitSound();
-  InitSoundProcess();
+  InitSoundServer();
   InitJoystick();
   InitRND(NEW_RANDOMIZE);
 
-  signal(SIGINT, CloseAll);
-  signal(SIGTERM, CloseAll);
+  signal(SIGINT, CloseAllAndExit);
+  signal(SIGTERM, CloseAllAndExit);
 
-  InitDisplay(argc, argv);
+  InitDisplay();
   InitWindow(argc, argv);
 
   XMapWindow(display, window);
@@ -76,6 +77,8 @@ void OpenAll(int argc, char *argv[])
   InitElementProperties();
 
   DrawMainMenu();
+
+  InitNetworkServer();
 }
 
 void InitLevelAndPlayerInfo()
@@ -83,12 +86,33 @@ void InitLevelAndPlayerInfo()
   local_player = &stored_player[0];
 
   if (!LoadLevelInfo())                        /* global level info */
-    CloseAll();
+    Error(ERR_EXIT, NULL);
 
   LoadPlayerInfo(PLAYER_SETUP);                /* global setup info */
   LoadPlayerInfo(PLAYER_LEVEL);                /* level specific info */
 }
 
+void InitNetworkServer()
+{
+  int nr_wanted;
+
+  standalone = FALSE;
+
+  if (standalone)
+    return;
+
+  nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED);
+
+  if (!ConnectToServer(server_host, server_port))
+    Error(ERR_EXIT, "cannot connect to multiplayer server");
+
+  SendToServer_Nickname(local_player->alias_name);
+  SendToServer_ProtocolVersion();
+
+  if (nr_wanted)
+    SendToServer_NrWanted(nr_wanted);
+}
+
 void InitSound()
 {
   int i;
@@ -99,15 +123,15 @@ void InitSound()
 #ifndef MSDOS
   if (access(sound_device_name,W_OK)<0)
   {
-    fprintf(stderr,"%s: cannot access sound device - no sounds\n",progname);
-    sound_status=SOUND_OFF;
+    Error(ERR_RETURN, "cannot access sound device - no sounds");
+    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;
+    Error(ERR_RETURN, "cannot open sound device - no sounds");
+    sound_status = SOUND_OFF;
     return;
   }
 
@@ -137,7 +161,7 @@ void InitSound()
   }
 }
 
-void InitSoundProcess()
+void InitSoundServer()
 {
   if (sound_status==SOUND_OFF)
     return;
@@ -145,14 +169,14 @@ void InitSoundProcess()
 #ifndef MSDOS
   if (pipe(sound_pipe)<0)
   {
-    fprintf(stderr,"%s: cannot create pipe - no sounds\n",progname);
+    Error(ERR_RETURN, "cannot create pipe - no sounds");
     sound_status=SOUND_OFF;
     return;
   }
 
   if ((sound_process_id=fork())<0)
   {       
-    fprintf(stderr,"%s: cannot create child process - no sounds\n",progname);
+    Error(ERR_RETURN, "cannot create child process - no sounds");
     sound_status=SOUND_OFF;
     return;
   }
@@ -174,16 +198,16 @@ void InitJoystick()
 #ifndef MSDOS
   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]);
+    Error(ERR_RETURN, "cannot access joystick device '%s'",
+         joystick_device_name[joystick_nr]);
     joystick_status = JOYSTICK_OFF;
     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]);
+    Error(ERR_RETURN, "cannot open joystick device '%s'",
+         joystick_device_name[joystick_nr]);
     joystick_status = JOYSTICK_OFF;
     return;
   }
@@ -195,37 +219,16 @@ void InitJoystick()
 #endif
 }
 
-void InitDisplay(int argc, char *argv[])
+void InitDisplay()
 {
-  char *display_name = NULL;
   XVisualInfo vinfo_template, *vinfo;
   int num_visuals;
   unsigned int depth;
-  int i;
-
-  /* get X server to connect to, if given as an argument */
-  for (i=1;i<argc-1;i++)
-  {
-    char *dispstr="-display";
-    int len=MAX(strlen(dispstr),strlen(argv[i]));
-
-    if (len<4)
-      continue;
-    else if (!strncmp(argv[i],dispstr,len))
-    {
-      display_name=argv[i+1];
-      break;
-    }
-  }
 
   /* connect to X server */
-  if (!(display=XOpenDisplay(display_name)))
-  {
-    fprintf(stderr,"%s: cannot connect to X server %s\n", 
-           progname, XDisplayName(display_name));
-    exit(-1);
-  }
-  
+  if (!(display = XOpenDisplay(display_name)))
+    Error(ERR_EXIT,"cannot connect to X server %s",XDisplayName(display_name));
+
   screen = DefaultScreen(display);
   visual = DefaultVisual(display, screen);
   depth  = DefaultDepth(display, screen);
@@ -312,22 +315,14 @@ void InitWindow(int argc, char *argv[])
                  &icon_width,&icon_height,
                  &icon_pixmap,&icon_hot_x,&icon_hot_y);
   if (!icon_pixmap)
-  {
-    fprintf(stderr, "%s: cannot read icon bitmap file '%s'.\n",
-           progname,icon_filename);
-    exit(-1);
-  }
+    Error(ERR_EXIT, "cannot read icon bitmap file '%s'", icon_filename);
 
   sprintf(icon_filename,"%s/%s",GFX_PATH,icon_pic.picturemask_filename);
   XReadBitmapFile(display,window,icon_filename,
                  &icon_width,&icon_height,
                  &iconmask_pixmap,&icon_hot_x,&icon_hot_y);
   if (!iconmask_pixmap)
-  {
-    fprintf(stderr, "%s: cannot read icon bitmap file '%s'.\n",
-           progname,icon_filename);
-    exit(-1);
-  }
+    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;
@@ -341,18 +336,10 @@ void InitWindow(int argc, char *argv[])
   }
 
   if (!XStringListToTextProperty(&window_name, 1, &windowName))
-  {
-    fprintf(stderr, "%s: structure allocation for windowName failed.\n",
-           progname);
-    exit(-1);
-  }
+    Error(ERR_EXIT, "structure allocation for windowName failed");
 
   if (!XStringListToTextProperty(&icon_name, 1, &iconName))
-  {
-    fprintf(stderr, "%s: structure allocation for iconName failed.\n",
-           progname);
-    exit(-1);
-  }
+    Error(ERR_EXIT, "structure allocation for iconName failed");
 
   wm_hints.initial_state = NormalState;
   wm_hints.input = True;
@@ -360,7 +347,7 @@ void InitWindow(int argc, char *argv[])
   wm_hints.icon_mask = iconmask_pixmap;
   wm_hints.flags = StateHint | IconPixmapHint | IconMaskHint | InputHint;
 
-  class_hints.res_name = progname;
+  class_hints.res_name = program_name;
   class_hints.res_class = "Rocks'n'Diamonds";
 
   XSetWMProperties(display, window, &windowName, &iconName, 
@@ -459,6 +446,7 @@ void InitGfx()
     { GFX_GEBLUBBER, 4 },
     { GFX_DYNAMIT, 7 },
     { GFX_DYNABOMB, 4 },
+    { GFX_EXPLOSION, 8 },
     { GFX_SOKOBAN_OBJEKT, 1 },
     { GFX_FUNKELN_BLAU, 3 },
     { GFX_FUNKELN_WEISS, 3 },
@@ -559,11 +547,7 @@ void InitGfx()
   }
 
   if (!pix[PIX_DB_BACK] || !pix[PIX_DB_DOOR])
-  {
-    fprintf(stderr, "%s: cannot create additional Pixmaps!\n",progname);
-    CloseAll();
-    exit(-1);
-  }
+    Error(ERR_EXIT, "cannot create additional pixmaps");
 
   for(i=0;i<NUM_PIXMAPS;i++)
   {
@@ -640,21 +624,13 @@ void LoadGfx(int pos, struct PictureFileInfo *pic)
     switch(xpm_err)
     {
       case XpmOpenFailed:
-        fprintf(stderr,"Cannot open Xpm file '%s' !\n",filename);
-       CloseAll();
-       exit(-1);
+       Error(ERR_EXIT, "cannot open XPM file '%s'", filename);
       case XpmFileInvalid:
-       fprintf(stderr,"Invalid Xpm file '%s'!\n",filename);
-       CloseAll();
-       exit(-1);
+       Error(ERR_EXIT, "invalid XPM file '%s'", filename);
       case XpmNoMemory:
-       fprintf(stderr,"Not enough memory for Xpm file '%s'!\n",filename);
-       CloseAll();
-       exit(1);
+       Error(ERR_EXIT, "not enough memory for XPM file '%s'", filename);
       case XpmColorFailed:
-       fprintf(stderr,"Can't get colors for Xpm file '%s'!\n",filename);
-       CloseAll();
-       exit(-1);
+       Error(ERR_EXIT, "cannot get colors for XPM file '%s'", filename);
       default:
        break;
     }
@@ -675,25 +651,15 @@ void LoadGfx(int pos, struct PictureFileInfo *pic)
       case GIF_Success:
         break;
       case GIF_OpenFailed:
-        fprintf(stderr,"Cannot open GIF file '%s' !\n",filename);
-       CloseAll();
-       exit(-1);
+        Error(ERR_EXIT, "cannot open GIF file '%s'", filename);
       case GIF_ReadFailed:
-        fprintf(stderr,"Cannot read GIF file '%s' !\n",filename);
-       CloseAll();
-       exit(-1);
+        Error(ERR_EXIT, "cannot read GIF file '%s'", filename);
       case GIF_FileInvalid:
-       fprintf(stderr,"Invalid GIF file '%s'!\n",filename);
-       CloseAll();
-       exit(-1);
+       Error(ERR_EXIT, "invalid GIF file '%s'", filename);
       case GIF_NoMemory:
-       fprintf(stderr,"Not enough memory for GIF file '%s'!\n",filename);
-       CloseAll();
-       exit(1);
+       Error(ERR_EXIT, "not enough memory for GIF file '%s'", filename);
       case GIF_ColorFailed:
-       fprintf(stderr,"Can't get colors for GIF file '%s'!\n",filename);
-       CloseAll();
-       exit(-1);
+       Error(ERR_EXIT, "cannot get colors for GIF file '%s'", filename);
       default:
        break;
     }
@@ -707,12 +673,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic)
 #endif
 
     if (!pix[pos])
-    {
-      fprintf(stderr, "%s: cannot get graphics for '%s'.\n",
-             progname, pic->picture_filename);
-      CloseAll();
-      exit(-1);
-    }
+      Error(ERR_EXIT, "cannot get graphics for '%s'", pic->picture_filename);
   }
 
   /* zugehörige Maske laden (wenn vorhanden) */
@@ -737,19 +698,11 @@ void LoadGfx(int pos, struct PictureFileInfo *pic)
       case BitmapSuccess:
         break;
       case BitmapOpenFailed:
-       fprintf(stderr,"Bitmap file open failed on '%s' !\n",filename);
-       CloseAll();
-       exit(-1);
-       break;
+       Error(ERR_EXIT, "cannot open XBM file '%s'", filename);
       case BitmapFileInvalid:
-       fprintf(stderr,"Bitmap file invalid: '%s' !\n",filename);
-       CloseAll();
-       exit(-1);
-       break;
+       Error(ERR_EXIT, "invalid XBM file '%s'", filename);
       case BitmapNoMemory:
-       fprintf(stderr,"No memory for file '%s' !\n",filename);
-       CloseAll();
-       exit(-1);
+       Error(ERR_EXIT, "not enough memory for XBM file '%s'", filename);
        break;
       default:
        break;
@@ -764,12 +717,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic)
 #endif
 
     if (!clipmask[pos])
-    {
-      fprintf(stderr, "%s: cannot get clipmask for '%s'.\n",
-             progname, pic->picture_filename);
-      CloseAll();
-      exit(-1);
-    }
+      Error(ERR_EXIT, "cannot get clipmask for '%s'", pic->picture_filename);
   }
 }
 
@@ -823,6 +771,9 @@ void InitElementProperties()
     EL_BETON,
     EL_MAUERWERK,
     EL_MAUER_LEBT,
+    EL_MAUER_X,
+    EL_MAUER_Y,
+    EL_MAUER_XY,
     EL_FELSBODEN,
     EL_AUSGANG_ZU,
     EL_AUSGANG_ACT,
@@ -924,6 +875,9 @@ void InitElementProperties()
     EL_MAUERWERK,
     EL_FELSBODEN,
     EL_MAUER_LEBT,
+    EL_MAUER_X,
+    EL_MAUER_Y,
+    EL_MAUER_XY,
     EL_MAUERND
   };
   static int ep_mauer_num = sizeof(ep_mauer)/sizeof(int);
@@ -1321,7 +1275,7 @@ void InitElementProperties()
     Elementeigenschaften[i] |= (EP_BIT_CHAR | EP_BIT_INACTIVE);
 }
 
-void CloseAll()
+void CloseAllAndExit(int exit_value)
 {
   int i;
 
@@ -1361,5 +1315,5 @@ void CloseAll()
     XCloseDisplay(display);
   }
 
-  exit(0);
+  exit(exit_value);
 }