rnd-19990809-1-src
[rocksndiamonds.git] / src / init.c
index e8de30a3d8ca3aee7fa33550b76cabdfbcc9fa8c..09804ee18381b0a84750a64338267125b2aa6a5d 100644 (file)
@@ -388,7 +388,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 +397,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,
@@ -480,7 +480,8 @@ void InitGfx()
     { "Door",  TRUE },
     { "Heroes",        TRUE },
     { "Toons", TRUE },
-    { "More",  TRUE },
+    { "SP",    TRUE },
+    { "DC",    TRUE },
     { "Font",  FALSE },
     { "Font2", FALSE }
   }; 
@@ -491,7 +492,8 @@ void InitGfx()
     { "RocksDoor",     TRUE },
     { "RocksHeroes",   TRUE },
     { "RocksToons",    TRUE },
-    { "RocksMore",     TRUE },
+    { "RocksSP",       TRUE },
+    { "RocksDC",       TRUE },
     { "RocksFont",     FALSE },
     { "RocksFont2",    FALSE }
   }; 
@@ -628,45 +630,12 @@ void InitGfx()
       int tile = tile_needs_clipping[i].start + j;
       int graphic = tile;
       int src_x, src_y;
-      Pixmap src_pixmap;
-
-#if 0
-      if (graphic >= GFX_START_ROCKSSCREEN &&
-         graphic <= GFX_END_ROCKSSCREEN)
-      {
-       src_pixmap = clipmask[PIX_BACK];
-       graphic -= GFX_START_ROCKSSCREEN;
-       src_x = SX + (graphic % GFX_PER_LINE) * TILEX;
-       src_y = SY + (graphic / GFX_PER_LINE) * TILEY;
-      }
-      else if (graphic >= GFX_START_ROCKSHEROES &&
-              graphic <= GFX_END_ROCKSHEROES)
-      {
-       src_pixmap = clipmask[PIX_HEROES];
-       graphic -= GFX_START_ROCKSHEROES;
-       src_x = (graphic % HEROES_PER_LINE) * TILEX;
-       src_y = (graphic / HEROES_PER_LINE) * TILEY;
-      }
-      else if (graphic >= GFX_START_ROCKSFONT &&
-              graphic <= GFX_END_ROCKSFONT)
-      {
-       src_pixmap = clipmask[PIX_BIGFONT];
-       graphic -= GFX_START_ROCKSFONT;
-       src_x = (graphic % FONT_CHARS_PER_LINE) * TILEX;
-       src_y = (graphic / FONT_CHARS_PER_LINE) * TILEY +
-         FC_SPECIAL1 * FONT_LINES_PER_FONT * TILEY;
-      }
-      else
-       break;
-#else
-
       int pixmap_nr;
+      Pixmap src_pixmap;
 
       getGraphicSource(graphic, &pixmap_nr, &src_x, &src_y);
       src_pixmap = clipmask[pixmap_nr];
 
-#endif
-
       tile_clipmask[tile] = XCreatePixmap(display, window, TILEX,TILEY, 1);
 
       XCopyArea(display,src_pixmap,tile_clipmask[tile],copy_clipmask_gc,
@@ -729,7 +698,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);
@@ -805,7 +774,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 */
@@ -876,7 +845,11 @@ void InitElementProperties()
     EL_SCHLUESSEL1,
     EL_SCHLUESSEL2,
     EL_SCHLUESSEL3,
-    EL_SCHLUESSEL4
+    EL_SCHLUESSEL4,
+    EL_EM_KEY_1,
+    EL_EM_KEY_2,
+    EL_EM_KEY_3,
+    EL_EM_KEY_4
   };
   static int ep_schluessel_num = sizeof(ep_schluessel)/sizeof(int);
 
@@ -897,7 +870,9 @@ 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
   };
   static int ep_pforte_num = sizeof(ep_pforte)/sizeof(int);
 
@@ -953,7 +928,34 @@ void InitElementProperties()
     EL_SP_HARD_BASE6,
     EL_SP_TERMINAL,
     EL_SP_EXIT,
-    EL_INVISIBLE_STEEL
+    EL_INVISIBLE_STEEL,
+    EL_BELT1_SWITCH_L,
+    EL_BELT1_SWITCH_M,
+    EL_BELT1_SWITCH_R,
+    EL_BELT2_SWITCH_L,
+    EL_BELT2_SWITCH_M,
+    EL_BELT2_SWITCH_R,
+    EL_BELT3_SWITCH_L,
+    EL_BELT3_SWITCH_M,
+    EL_BELT3_SWITCH_R,
+    EL_BELT4_SWITCH_L,
+    EL_BELT4_SWITCH_M,
+    EL_BELT4_SWITCH_R,
+    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
   };
   static int ep_solid_num = sizeof(ep_solid)/sizeof(int);
 
@@ -982,6 +984,8 @@ void InitElementProperties()
     EL_EM_GATE_2X,
     EL_EM_GATE_3X,
     EL_EM_GATE_4X,
+    EL_SWITCHGATE_OPEN,
+    EL_SWITCHGATE_CLOSED,
     EL_SP_HARD_GRAY,
     EL_SP_HARD_GREEN,
     EL_SP_HARD_BLUE,
@@ -993,7 +997,34 @@ void InitElementProperties()
     EL_SP_HARD_BASE4,
     EL_SP_HARD_BASE5,
     EL_SP_HARD_BASE6,
-    EL_INVISIBLE_STEEL
+    EL_INVISIBLE_STEEL,
+    EL_BELT1_SWITCH_L,
+    EL_BELT1_SWITCH_M,
+    EL_BELT1_SWITCH_R,
+    EL_BELT2_SWITCH_L,
+    EL_BELT2_SWITCH_M,
+    EL_BELT2_SWITCH_R,
+    EL_BELT3_SWITCH_L,
+    EL_BELT3_SWITCH_M,
+    EL_BELT3_SWITCH_R,
+    EL_BELT4_SWITCH_L,
+    EL_BELT4_SWITCH_M,
+    EL_BELT4_SWITCH_R,
+    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
   };
   static int ep_massive_num = sizeof(ep_massive)/sizeof(int);
 
@@ -1025,7 +1056,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);
 
@@ -1091,7 +1123,8 @@ void InitElementProperties()
     EL_SP_HARD_BASE6,
     EL_SP_TERMINAL,
     EL_SP_EXIT,
-    EL_INVISIBLE_STEEL
+    EL_INVISIBLE_STEEL,
+    EL_STEEL_SLANTED
   };
   static int ep_mauer_num = sizeof(ep_mauer)/sizeof(int);
 
@@ -1131,6 +1164,10 @@ void InitElementProperties()
     EL_SCHLUESSEL2,
     EL_SCHLUESSEL3,
     EL_SCHLUESSEL4,
+    EL_EM_KEY_1,
+    EL_EM_KEY_2,
+    EL_EM_KEY_3,
+    EL_EM_KEY_4,
     EL_BOMBE,
     EL_KOKOSNUSS,
     EL_TROPFEN,
@@ -1222,7 +1259,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);
 
@@ -1318,6 +1356,10 @@ void InitElementProperties()
     EL_SCHLUESSEL2,
     EL_SCHLUESSEL3,
     EL_SCHLUESSEL4,
+    EL_EM_KEY_1,
+    EL_EM_KEY_2,
+    EL_EM_KEY_3,
+    EL_EM_KEY_4,
     EL_PFORTE1,
     EL_PFORTE2,
     EL_PFORTE3,
@@ -1334,7 +1376,7 @@ void InitElementProperties()
     EL_EM_GATE_2X,
     EL_EM_GATE_3X,
     EL_EM_GATE_4X,
-    EL_DYNAMIT_AUS,
+    EL_DYNAMITE_INACTIVE,
     EL_UNSICHTBAR,
     EL_BIRNE_AUS,
     EL_BIRNE_EIN,
@@ -1393,16 +1435,44 @@ void InitElementProperties()
     EL_SP_HARD_BASE5,
     EL_SP_HARD_BASE6,
     EL_SP_EXIT,
-    EL_INVISIBLE_STEEL
+    EL_INVISIBLE_STEEL,
+    EL_BELT1_SWITCH_L,
+    EL_BELT1_SWITCH_M,
+    EL_BELT1_SWITCH_R,
+    EL_BELT2_SWITCH_L,
+    EL_BELT2_SWITCH_M,
+    EL_BELT2_SWITCH_R,
+    EL_BELT3_SWITCH_L,
+    EL_BELT3_SWITCH_M,
+    EL_BELT3_SWITCH_R,
+    EL_BELT4_SWITCH_L,
+    EL_BELT4_SWITCH_M,
+    EL_BELT4_SWITCH_R,
+    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
   };
   static int ep_inactive_num = sizeof(ep_inactive)/sizeof(int);
 
   static int ep_explosive[] =
   {
     EL_BOMBE,
-    EL_DYNAMIT,
-    EL_DYNAMIT_AUS,
-    EL_DYNABOMB,
+    EL_DYNAMITE_ACTIVE,
+    EL_DYNAMITE_INACTIVE,
+    EL_DYNABOMB_ACTIVE_1,
+    EL_DYNABOMB_ACTIVE_2,
+    EL_DYNABOMB_ACTIVE_3,
+    EL_DYNABOMB_ACTIVE_4,
     EL_DYNABOMB_NR,
     EL_DYNABOMB_SZ,
     EL_DYNABOMB_XL,
@@ -1470,7 +1540,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);
 
@@ -1515,7 +1586,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);
 
@@ -1539,7 +1612,8 @@ 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
   };
   static int ep_quick_gate_num = sizeof(ep_quick_gate)/sizeof(int);
 
@@ -1559,7 +1633,51 @@ void InitElementProperties()
   };
   static int ep_over_player_num = sizeof(ep_over_player)/sizeof(int);
 
-  static long ep_bit[] =
+  static int ep_active_bomb[] =
+  {
+    EL_DYNAMITE_ACTIVE,
+    EL_DYNABOMB_ACTIVE_1,
+    EL_DYNABOMB_ACTIVE_2,
+    EL_DYNABOMB_ACTIVE_3,
+    EL_DYNABOMB_ACTIVE_4
+  };
+  static int ep_active_bomb_num = sizeof(ep_active_bomb)/sizeof(int);
+
+  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_L,
+    EL_BELT1_SWITCH_M,
+    EL_BELT1_SWITCH_R,
+    EL_BELT2_SWITCH_L,
+    EL_BELT2_SWITCH_M,
+    EL_BELT2_SWITCH_R,
+    EL_BELT3_SWITCH_L,
+    EL_BELT3_SWITCH_M,
+    EL_BELT3_SWITCH_R,
+    EL_BELT4_SWITCH_L,
+    EL_BELT4_SWITCH_M,
+    EL_BELT4_SWITCH_R,
+  };
+  static int ep_belt_switch_num = sizeof(ep_belt_switch)/sizeof(int);
+
+  static long ep1_bit[] =
   {
     EP_BIT_AMOEBALIVE,
     EP_BIT_AMOEBOID,
@@ -1590,9 +1708,15 @@ void InitElementProperties()
     EP_BIT_EATABLE,
     EP_BIT_SP_ELEMENT,
     EP_BIT_QUICK_GATE,
-    EP_BIT_OVER_PLAYER
+    EP_BIT_OVER_PLAYER,
+    EP_BIT_ACTIVE_BOMB
+  };
+  static long ep2_bit[] =
+  {
+    EP_BIT_BELT,
+    EP_BIT_BELT_SWITCH
   };
-  static int *ep_array[] =
+  static int *ep1_array[] =
   {
     ep_amoebalive,
     ep_amoeboid,
@@ -1623,9 +1747,15 @@ void InitElementProperties()
     ep_eatable,
     ep_sp_element,
     ep_quick_gate,
-    ep_over_player
+    ep_over_player,
+    ep_active_bomb
+  };
+  static int *ep2_array[] =
+  {
+    ep_belt,
+    ep_belt_switch
   };
-  static int *ep_num[] =
+  static int *ep1_num[] =
   {
     &ep_amoebalive_num,
     &ep_amoeboid_num,
@@ -1656,18 +1786,32 @@ void InitElementProperties()
     &ep_eatable_num,
     &ep_sp_element_num,
     &ep_quick_gate_num,
-    &ep_over_player_num
+    &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)