rnd-19990928-1-src
[rocksndiamonds.git] / src / init.c
index 4f18c12a2e613f62bd5a69fd26d7eaf4b7cdf639..b8fe9cc7125afa26aa412c06c1215c0271848911 100644 (file)
@@ -55,6 +55,10 @@ static void InitElementProperties(void);
 
 void OpenAll(int argc, char *argv[])
 {
+#ifdef MSDOS
+  initErrorFile();
+#endif
+
   if (options.serveronly)
   {
     NetworkServer(options.server_port, options.serveronly);
@@ -63,8 +67,6 @@ void OpenAll(int argc, char *argv[])
     exit(0);
   }
 
-  InitLevelAndPlayerInfo();
-
   InitCounter();
   InitSound();
   InitSoundServer();
@@ -81,8 +83,10 @@ void OpenAll(int argc, char *argv[])
   XFlush(display);
 
   InitGfx();
-  InitElementProperties();
+  InitElementProperties();     /* initializes IS_CHAR() for el2gfx() */
+
   InitGadgets();
+  InitLevelAndPlayerInfo();
 
   DrawMainMenu();
 
@@ -104,9 +108,10 @@ void InitLevelAndPlayerInfo()
 
   local_player->connected = TRUE;
 
-  LoadLevelInfo();                     /* global level info */
-  LoadSetup();                         /* global setup info */
-  LoadLevelSetup();                    /* info about last played level */
+  LoadLevelInfo();                             /* global level info */
+  LoadSetup();                                 /* global setup info */
+  LoadLevelSetup_LastSeries();                 /* last played series info */
+  LoadLevelSetup_SeriesInfo(leveldir_nr);      /* last played level info */
 }
 
 void InitNetworkServer()
@@ -388,7 +393,7 @@ void InitWindow(int argc, char *argv[])
                    PropModePrepend, (unsigned char *) &delete_atom, 1);
 
   sprintf(icon_filename, "%s/%s/%s",
-         options.base_directory, GRAPHICS_DIRECTORY,
+         options.ro_base_directory, GRAPHICS_DIRECTORY,
          icon_pic.picture_filename);
   XReadBitmapFile(display,window,icon_filename,
                  &icon_width,&icon_height,
@@ -397,7 +402,7 @@ void InitWindow(int argc, char *argv[])
     Error(ERR_EXIT, "cannot read icon bitmap file '%s'", icon_filename);
 
   sprintf(icon_filename, "%s/%s/%s",
-         options.base_directory, GRAPHICS_DIRECTORY,
+         options.ro_base_directory, GRAPHICS_DIRECTORY,
          icon_pic.picturemask_filename);
   XReadBitmapFile(display,window,icon_filename,
                  &icon_width,&icon_height,
@@ -455,17 +460,6 @@ void InitWindow(int argc, char *argv[])
   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);
-  }
-}
-
 void InitGfx()
 {
   int i,j;
@@ -480,9 +474,11 @@ void InitGfx()
     { "Door",  TRUE },
     { "Heroes",        TRUE },
     { "Toons", TRUE },
-    { "More",  TRUE },
+    { "SP",    TRUE },
+    { "DC",    TRUE },
     { "Font",  FALSE },
-    { "Font2", FALSE }
+    { "Font2", FALSE },
+    { "Font3", FALSE }
   }; 
 #else
   static struct PictureFileInfo pic[NUM_PICTURES] =
@@ -491,9 +487,11 @@ void InitGfx()
     { "RocksDoor",     TRUE },
     { "RocksHeroes",   TRUE },
     { "RocksToons",    TRUE },
-    { "RocksMore",     TRUE },
+    { "RocksSP",       TRUE },
+    { "RocksDC",       TRUE },
     { "RocksFont",     FALSE },
-    { "RocksFont2",    FALSE }
+    { "RocksFont2",    FALSE },
+    { "RocksFont3",    FALSE }
   }; 
 #endif
 
@@ -559,6 +557,8 @@ void InitGfx()
     { GFX_SOKOBAN_OBJEKT, 1 },
     { GFX_FUNKELN_BLAU, 3 },
     { GFX_FUNKELN_WEISS, 3 },
+    { GFX2_SHIELD_PASSIVE, 3 },
+    { GFX2_SHIELD_ACTIVE, 3 },
     { -1, 0 }
   };
 
@@ -696,7 +696,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic)
     sprintf(basefilename, "%s%s", pic->picture_filename, picture_ext);
     DrawInitText(basefilename, 150, FC_YELLOW);
     sprintf(filename, "%s/%s/%s",
-           options.base_directory, GRAPHICS_DIRECTORY, basefilename);
+           options.ro_base_directory, GRAPHICS_DIRECTORY, basefilename);
 
 #ifdef MSDOS
     rest(100);
@@ -772,7 +772,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic)
     sprintf(basefilename, "%s%s", pic->picture_filename, picturemask_ext);
     DrawInitText(basefilename, 150, FC_YELLOW);
     sprintf(filename, "%s/%s/%s",
-           options.base_directory, GRAPHICS_DIRECTORY, basefilename);
+           options.ro_base_directory, GRAPHICS_DIRECTORY, basefilename);
 
 #if DEBUG_TIMING
     debug_print_timestamp(1, NULL);    /* initialize timestamp function */
@@ -868,7 +868,11 @@ void InitElementProperties()
     EL_EM_GATE_1X,
     EL_EM_GATE_2X,
     EL_EM_GATE_3X,
-    EL_EM_GATE_4X
+    EL_EM_GATE_4X,
+    EL_SWITCHGATE_OPEN,
+    EL_SWITCHGATE_CLOSED,
+    EL_TIMEGATE_OPEN,
+    EL_TIMEGATE_CLOSED
   };
   static int ep_pforte_num = sizeof(ep_pforte)/sizeof(int);
 
@@ -924,7 +928,50 @@ void InitElementProperties()
     EL_SP_HARD_BASE6,
     EL_SP_TERMINAL,
     EL_SP_EXIT,
-    EL_INVISIBLE_STEEL
+    EL_INVISIBLE_STEEL,
+    EL_BELT1_SWITCH_LEFT,
+    EL_BELT1_SWITCH_MIDDLE,
+    EL_BELT1_SWITCH_RIGHT,
+    EL_BELT2_SWITCH_LEFT,
+    EL_BELT2_SWITCH_MIDDLE,
+    EL_BELT2_SWITCH_RIGHT,
+    EL_BELT3_SWITCH_LEFT,
+    EL_BELT3_SWITCH_MIDDLE,
+    EL_BELT3_SWITCH_RIGHT,
+    EL_BELT4_SWITCH_LEFT,
+    EL_BELT4_SWITCH_MIDDLE,
+    EL_BELT4_SWITCH_RIGHT,
+    EL_SWITCHGATE_SWITCH_1,
+    EL_SWITCHGATE_SWITCH_2,
+    EL_LIGHT_SWITCH_OFF,
+    EL_LIGHT_SWITCH_ON,
+    EL_TIMEGATE_SWITCH_OFF,
+    EL_TIMEGATE_SWITCH_ON,
+    EL_SIGN_EXCLAMATION,
+    EL_SIGN_RADIOACTIVITY,
+    EL_SIGN_STOP,
+    EL_SIGN_WHEELCHAIR,
+    EL_SIGN_PARKING,
+    EL_SIGN_ONEWAY,
+    EL_SIGN_HEART,
+    EL_SIGN_TRIANGLE,
+    EL_SIGN_ROUND,
+    EL_SIGN_EXIT,
+    EL_SIGN_YINYANG,
+    EL_SIGN_OTHER,
+    EL_STEEL_SLANTED,
+    EL_EMC_STEEL_WALL_1,
+    EL_EMC_STEEL_WALL_2,
+    EL_EMC_STEEL_WALL_3,
+    EL_EMC_STEEL_WALL_4,
+    EL_EMC_WALL_1,
+    EL_EMC_WALL_2,
+    EL_EMC_WALL_3,
+    EL_EMC_WALL_4,
+    EL_EMC_WALL_5,
+    EL_EMC_WALL_6,
+    EL_EMC_WALL_7,
+    EL_EMC_WALL_8
   };
   static int ep_solid_num = sizeof(ep_solid)/sizeof(int);
 
@@ -953,6 +1000,10 @@ void InitElementProperties()
     EL_EM_GATE_2X,
     EL_EM_GATE_3X,
     EL_EM_GATE_4X,
+    EL_SWITCHGATE_OPEN,
+    EL_SWITCHGATE_CLOSED,
+    EL_TIMEGATE_OPEN,
+    EL_TIMEGATE_CLOSED,
     EL_SP_HARD_GRAY,
     EL_SP_HARD_GREEN,
     EL_SP_HARD_BLUE,
@@ -964,7 +1015,38 @@ void InitElementProperties()
     EL_SP_HARD_BASE4,
     EL_SP_HARD_BASE5,
     EL_SP_HARD_BASE6,
-    EL_INVISIBLE_STEEL
+    EL_INVISIBLE_STEEL,
+    EL_BELT1_SWITCH_LEFT,
+    EL_BELT1_SWITCH_MIDDLE,
+    EL_BELT1_SWITCH_RIGHT,
+    EL_BELT2_SWITCH_LEFT,
+    EL_BELT2_SWITCH_MIDDLE,
+    EL_BELT2_SWITCH_RIGHT,
+    EL_BELT3_SWITCH_LEFT,
+    EL_BELT3_SWITCH_MIDDLE,
+    EL_BELT3_SWITCH_RIGHT,
+    EL_BELT4_SWITCH_LEFT,
+    EL_BELT4_SWITCH_MIDDLE,
+    EL_BELT4_SWITCH_RIGHT,
+    EL_LIGHT_SWITCH_OFF,
+    EL_LIGHT_SWITCH_ON,
+    EL_SIGN_EXCLAMATION,
+    EL_SIGN_RADIOACTIVITY,
+    EL_SIGN_STOP,
+    EL_SIGN_WHEELCHAIR,
+    EL_SIGN_PARKING,
+    EL_SIGN_ONEWAY,
+    EL_SIGN_HEART,
+    EL_SIGN_TRIANGLE,
+    EL_SIGN_ROUND,
+    EL_SIGN_EXIT,
+    EL_SIGN_YINYANG,
+    EL_SIGN_OTHER,
+    EL_STEEL_SLANTED,
+    EL_EMC_STEEL_WALL_1,
+    EL_EMC_STEEL_WALL_2,
+    EL_EMC_STEEL_WALL_3,
+    EL_EMC_STEEL_WALL_4
   };
   static int ep_massive_num = sizeof(ep_massive)/sizeof(int);
 
@@ -996,7 +1078,8 @@ void InitElementProperties()
     EL_SP_CHIP_RIGHT,
     EL_SP_CHIP_UPPER,
     EL_SP_CHIP_LOWER,
-    EL_SPEED_PILL
+    EL_SPEED_PILL,
+    EL_STEEL_SLANTED
   };
   static int ep_slippery_num = sizeof(ep_slippery)/sizeof(int);
 
@@ -1062,7 +1145,20 @@ void InitElementProperties()
     EL_SP_HARD_BASE6,
     EL_SP_TERMINAL,
     EL_SP_EXIT,
-    EL_INVISIBLE_STEEL
+    EL_INVISIBLE_STEEL,
+    EL_STEEL_SLANTED,
+    EL_EMC_STEEL_WALL_1,
+    EL_EMC_STEEL_WALL_2,
+    EL_EMC_STEEL_WALL_3,
+    EL_EMC_STEEL_WALL_4,
+    EL_EMC_WALL_1,
+    EL_EMC_WALL_2,
+    EL_EMC_WALL_3,
+    EL_EMC_WALL_4,
+    EL_EMC_WALL_5,
+    EL_EMC_WALL_6,
+    EL_EMC_WALL_7,
+    EL_EMC_WALL_8
   };
   static int ep_mauer_num = sizeof(ep_mauer)/sizeof(int);
 
@@ -1139,38 +1235,39 @@ void InitElementProperties()
     EL_MAMPFER2,
     EL_ROBOT,
     EL_PACMAN,
-    EL_MAULWURF,
+    EL_MOLE,
     EL_PINGUIN,
     EL_SCHWEIN,
     EL_DRACHE,
     EL_SONDE,
     EL_SP_SNIKSNAK,
-    EL_SP_ELECTRON
+    EL_SP_ELECTRON,
+    EL_BALLOON
   };
   static int ep_can_move_num = sizeof(ep_can_move)/sizeof(int);
 
   static int ep_could_move[] =
   {
-    EL_KAEFER_R,
-    EL_KAEFER_O,
-    EL_KAEFER_L,
-    EL_KAEFER_U,
-    EL_FLIEGER_R,
-    EL_FLIEGER_O,
-    EL_FLIEGER_L,
-    EL_FLIEGER_U,
-    EL_BUTTERFLY_R,
-    EL_BUTTERFLY_O,
-    EL_BUTTERFLY_L,
-    EL_BUTTERFLY_U,
-    EL_FIREFLY_R,
-    EL_FIREFLY_O,
-    EL_FIREFLY_L,
-    EL_FIREFLY_U,
-    EL_PACMAN_R,
-    EL_PACMAN_O,
-    EL_PACMAN_L,
-    EL_PACMAN_U
+    EL_KAEFER_RIGHT,
+    EL_KAEFER_UP,
+    EL_KAEFER_LEFT,
+    EL_KAEFER_DOWN,
+    EL_FLIEGER_RIGHT,
+    EL_FLIEGER_UP,
+    EL_FLIEGER_LEFT,
+    EL_FLIEGER_DOWN,
+    EL_BUTTERFLY_RIGHT,
+    EL_BUTTERFLY_UP,
+    EL_BUTTERFLY_LEFT,
+    EL_BUTTERFLY_DOWN,
+    EL_FIREFLY_RIGHT,
+    EL_FIREFLY_UP,
+    EL_FIREFLY_LEFT,
+    EL_FIREFLY_DOWN,
+    EL_PACMAN_RIGHT,
+    EL_PACMAN_UP,
+    EL_PACMAN_LEFT,
+    EL_PACMAN_DOWN
   };
   static int ep_could_move_num = sizeof(ep_could_move)/sizeof(int);
 
@@ -1197,7 +1294,8 @@ void InitElementProperties()
     EL_SALZSAEURE,
     EL_SP_SNIKSNAK,
     EL_SP_ELECTRON,
-    EL_SP_BUG_ACTIVE
+    EL_SP_BUG_ACTIVE,
+    EL_LANDMINE
   };
   static int ep_dont_go_to_num = sizeof(ep_dont_go_to)/sizeof(int);
 
@@ -1372,7 +1470,44 @@ void InitElementProperties()
     EL_SP_HARD_BASE5,
     EL_SP_HARD_BASE6,
     EL_SP_EXIT,
-    EL_INVISIBLE_STEEL
+    EL_INVISIBLE_STEEL,
+    EL_BELT1_SWITCH_LEFT,
+    EL_BELT1_SWITCH_MIDDLE,
+    EL_BELT1_SWITCH_RIGHT,
+    EL_BELT2_SWITCH_LEFT,
+    EL_BELT2_SWITCH_MIDDLE,
+    EL_BELT2_SWITCH_RIGHT,
+    EL_BELT3_SWITCH_LEFT,
+    EL_BELT3_SWITCH_MIDDLE,
+    EL_BELT3_SWITCH_RIGHT,
+    EL_BELT4_SWITCH_LEFT,
+    EL_BELT4_SWITCH_MIDDLE,
+    EL_BELT4_SWITCH_RIGHT,
+    EL_SIGN_EXCLAMATION,
+    EL_SIGN_RADIOACTIVITY,
+    EL_SIGN_STOP,
+    EL_SIGN_WHEELCHAIR,
+    EL_SIGN_PARKING,
+    EL_SIGN_ONEWAY,
+    EL_SIGN_HEART,
+    EL_SIGN_TRIANGLE,
+    EL_SIGN_ROUND,
+    EL_SIGN_EXIT,
+    EL_SIGN_YINYANG,
+    EL_SIGN_OTHER,
+    EL_STEEL_SLANTED,
+    EL_EMC_STEEL_WALL_1,
+    EL_EMC_STEEL_WALL_2,
+    EL_EMC_STEEL_WALL_3,
+    EL_EMC_STEEL_WALL_4,
+    EL_EMC_WALL_1,
+    EL_EMC_WALL_2,
+    EL_EMC_WALL_3,
+    EL_EMC_WALL_4,
+    EL_EMC_WALL_5,
+    EL_EMC_WALL_6,
+    EL_EMC_WALL_7,
+    EL_EMC_WALL_8
   };
   static int ep_inactive_num = sizeof(ep_inactive)/sizeof(int);
 
@@ -1389,7 +1524,7 @@ void InitElementProperties()
     EL_DYNABOMB_SZ,
     EL_DYNABOMB_XL,
     EL_KAEFER,
-    EL_MAULWURF,
+    EL_MOLE,
     EL_PINGUIN,
     EL_SCHWEIN,
     EL_DRACHE,
@@ -1424,7 +1559,8 @@ void InitElementProperties()
     EL_SONDE,
     EL_SP_ZONK,
     EL_SP_DISK_ORANGE,
-    EL_SP_DISK_YELLOW
+    EL_SP_DISK_YELLOW,
+    EL_BALLOON
   };
   static int ep_pushable_num = sizeof(ep_pushable)/sizeof(int);
 
@@ -1452,7 +1588,8 @@ void InitElementProperties()
   {
     EL_ERDREICH,
     EL_SP_BASE,
-    EL_SP_BUG
+    EL_SP_BUG,
+    EL_SAND_INVISIBLE
   };
   static int ep_eatable_num = sizeof(ep_eatable)/sizeof(int);
 
@@ -1497,7 +1634,9 @@ void InitElementProperties()
     EL_SP_HARD_BASE5,
     EL_SP_HARD_BASE6,
     EL_SP_CHIP_UPPER,
-    EL_SP_CHIP_LOWER
+    EL_SP_CHIP_LOWER,
+    /* additional elements that appeared in newer Supaplex levels */
+    EL_UNSICHTBAR
   };
   static int ep_sp_element_num = sizeof(ep_sp_element)/sizeof(int);
 
@@ -1521,7 +1660,9 @@ void InitElementProperties()
     EL_SP_PORT2_DOWN,
     EL_SP_PORT_X,
     EL_SP_PORT_Y,
-    EL_SP_PORT_XY
+    EL_SP_PORT_XY,
+    EL_SWITCHGATE_OPEN,
+    EL_TIMEGATE_OPEN
   };
   static int ep_quick_gate_num = sizeof(ep_quick_gate)/sizeof(int);
 
@@ -1551,7 +1692,41 @@ void InitElementProperties()
   };
   static int ep_active_bomb_num = sizeof(ep_active_bomb)/sizeof(int);
 
-  static long ep_bit[] =
+  static int ep_belt[] =
+  {
+    EL_BELT1_LEFT,
+    EL_BELT1_MIDDLE,
+    EL_BELT1_RIGHT,
+    EL_BELT2_LEFT,
+    EL_BELT2_MIDDLE,
+    EL_BELT2_RIGHT,
+    EL_BELT3_LEFT,
+    EL_BELT3_MIDDLE,
+    EL_BELT3_RIGHT,
+    EL_BELT4_LEFT,
+    EL_BELT4_MIDDLE,
+    EL_BELT4_RIGHT,
+  };
+  static int ep_belt_num = sizeof(ep_belt)/sizeof(int);
+
+  static int ep_belt_switch[] =
+  {
+    EL_BELT1_SWITCH_LEFT,
+    EL_BELT1_SWITCH_MIDDLE,
+    EL_BELT1_SWITCH_RIGHT,
+    EL_BELT2_SWITCH_LEFT,
+    EL_BELT2_SWITCH_MIDDLE,
+    EL_BELT2_SWITCH_RIGHT,
+    EL_BELT3_SWITCH_LEFT,
+    EL_BELT3_SWITCH_MIDDLE,
+    EL_BELT3_SWITCH_RIGHT,
+    EL_BELT4_SWITCH_LEFT,
+    EL_BELT4_SWITCH_MIDDLE,
+    EL_BELT4_SWITCH_RIGHT,
+  };
+  static int ep_belt_switch_num = sizeof(ep_belt_switch)/sizeof(int);
+
+  static long ep1_bit[] =
   {
     EP_BIT_AMOEBALIVE,
     EP_BIT_AMOEBOID,
@@ -1585,7 +1760,12 @@ void InitElementProperties()
     EP_BIT_OVER_PLAYER,
     EP_BIT_ACTIVE_BOMB
   };
-  static int *ep_array[] =
+  static long ep2_bit[] =
+  {
+    EP_BIT_BELT,
+    EP_BIT_BELT_SWITCH
+  };
+  static int *ep1_array[] =
   {
     ep_amoebalive,
     ep_amoeboid,
@@ -1619,7 +1799,12 @@ void InitElementProperties()
     ep_over_player,
     ep_active_bomb
   };
-  static int *ep_num[] =
+  static int *ep2_array[] =
+  {
+    ep_belt,
+    ep_belt_switch
+  };
+  static int *ep1_num[] =
   {
     &ep_amoebalive_num,
     &ep_amoeboid_num,
@@ -1653,16 +1838,29 @@ void InitElementProperties()
     &ep_over_player_num,
     &ep_active_bomb_num
   };
-  static int num_properties = sizeof(ep_num)/sizeof(int *);
+  static int *ep2_num[] =
+  {
+    &ep_belt_num,
+    &ep_belt_switch_num
+  };
+  static int num_properties1 = sizeof(ep1_num)/sizeof(int *);
+  static int num_properties2 = sizeof(ep2_num)/sizeof(int *);
 
   for(i=0; i<MAX_ELEMENTS; i++)
-    Elementeigenschaften[i] = 0;
+  {
+    Elementeigenschaften1[i] = 0;
+    Elementeigenschaften2[i] = 0;
+  }
+
+  for(i=0; i<num_properties1; i++)
+    for(j=0; j<*(ep1_num[i]); j++)
+      Elementeigenschaften1[(ep1_array[i])[j]] |= ep1_bit[i];
+  for(i=0; i<num_properties2; i++)
+    for(j=0; j<*(ep2_num[i]); j++)
+      Elementeigenschaften2[(ep2_array[i])[j]] |= ep2_bit[i];
 
-  for(i=0; i<num_properties; i++)
-    for(j=0; j<*(ep_num[i]); j++)
-      Elementeigenschaften[(ep_array[i])[j]] |= ep_bit[i];
   for(i=EL_CHAR_START; i<EL_CHAR_END; i++)
-    Elementeigenschaften[i] |= (EP_BIT_CHAR | EP_BIT_INACTIVE);
+    Elementeigenschaften1[i] |= (EP_BIT_CHAR | EP_BIT_INACTIVE);
 }
 
 void CloseAllAndExit(int exit_value)