rnd-19990314-2-src
[rocksndiamonds.git] / src / init.c
index 77c5fb65e88283a984432e09eaa2d26e62ee5acd..dcd822443f976931102c8c6d8c6ef5af084207b4 100644 (file)
@@ -18,6 +18,8 @@
 #include "sound.h"
 #include "screens.h"
 #include "editor.h"
+#include "game.h"
+#include "tape.h"
 #include "tools.h"
 #include "files.h"
 #include "joystick.h"
@@ -48,6 +50,7 @@ static void InitSoundServer(void);
 static void InitWindow(int, char **);
 static void InitGfx(void);
 static void LoadGfx(int, struct PictureFileInfo *);
+static void InitGadgets(void);
 static void InitElementProperties(void);
 
 void OpenAll(int argc, char *argv[])
@@ -67,7 +70,6 @@ void OpenAll(int argc, char *argv[])
   InitSoundServer();
   InitJoysticks();
   InitRND(NEW_RANDOMIZE);
-  InitLevelEditorGadgets();
 
   signal(SIGINT, CloseAllAndExit);
   signal(SIGTERM, CloseAllAndExit);
@@ -80,6 +82,7 @@ void OpenAll(int argc, char *argv[])
 
   InitGfx();
   InitElementProperties();
+  InitGadgets();
 
   DrawMainMenu();
 
@@ -385,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,
@@ -394,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,
@@ -494,6 +497,21 @@ void InitGfx()
   }; 
 #endif
 
+#ifdef DEBUG
+#if 0
+  static struct PictureFileInfo test_pic1 =
+  {
+    "RocksFont2",
+    FALSE
+  };
+  static struct PictureFileInfo test_pic2 =
+  {
+    "mouse",
+    FALSE
+  };
+#endif
+#endif
+
   static struct
   {
     int start;
@@ -525,6 +543,15 @@ void InitGfx()
     { GFX_SPIELER4_RIGHT, 4 },
     { GFX_SPIELER4_PUSH_LEFT, 4 },
     { GFX_SPIELER4_PUSH_RIGHT, 4 },
+    { GFX_SP_MURPHY, 1 },
+    { GFX_MURPHY_GO_LEFT, 3 },
+    { GFX_MURPHY_GO_RIGHT, 3 },
+    { GFX_MURPHY_SNAP_UP, 1 },
+    { GFX_MURPHY_SNAP_DOWN, 1 },
+    { GFX_MURPHY_SNAP_RIGHT, 1 },
+    { GFX_MURPHY_SNAP_LEFT, 1 },
+    { GFX_MURPHY_PUSH_RIGHT, 1 },
+    { GFX_MURPHY_PUSH_LEFT, 1 },
     { GFX_GEBLUBBER, 4 },
     { GFX_DYNAMIT, 7 },
     { GFX_DYNABOMB, 4 },
@@ -539,6 +566,19 @@ void InitGfx()
   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);
@@ -588,35 +628,11 @@ void InitGfx()
       int tile = tile_needs_clipping[i].start + j;
       int graphic = tile;
       int src_x, src_y;
+      int pixmap_nr;
       Pixmap src_pixmap;
 
-      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;
+      getGraphicSource(graphic, &pixmap_nr, &src_x, &src_y);
+      src_pixmap = clipmask[pixmap_nr];
 
       tile_clipmask[tile] = XCreatePixmap(display, window, TILEX,TILEY, 1);
 
@@ -680,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);
@@ -756,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 */
@@ -791,6 +807,14 @@ void LoadGfx(int pos, struct PictureFileInfo *pic)
   }
 }
 
+void InitGadgets()
+{
+  CreateLevelEditorGadgets();
+  CreateGameButtons();
+  CreateTapeButtons();
+  CreateToolButtons();
+}
+
 void InitElementProperties()
 {
   int i,j;
@@ -819,7 +843,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);
 
@@ -832,7 +860,15 @@ void InitElementProperties()
     EL_PFORTE1X,
     EL_PFORTE2X,
     EL_PFORTE3X,
-    EL_PFORTE4X
+    EL_PFORTE4X,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1X,
+    EL_EM_GATE_2X,
+    EL_EM_GATE_3X,
+    EL_EM_GATE_4X
   };
   static int ep_pforte_num = sizeof(ep_pforte)/sizeof(int);
 
@@ -909,6 +945,14 @@ void InitElementProperties()
     EL_PFORTE2X,
     EL_PFORTE3X,
     EL_PFORTE4X,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1X,
+    EL_EM_GATE_2X,
+    EL_EM_GATE_3X,
+    EL_EM_GATE_4X,
     EL_SP_HARD_GRAY,
     EL_SP_HARD_GREEN,
     EL_SP_HARD_BLUE,
@@ -982,6 +1026,14 @@ void InitElementProperties()
     EL_PFORTE2X,
     EL_PFORTE3X,
     EL_PFORTE4X,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1X,
+    EL_EM_GATE_2X,
+    EL_EM_GATE_3X,
+    EL_EM_GATE_4X,
     EL_AUSGANG_ZU,
     EL_AUSGANG_ACT,
     EL_AUSGANG_AUF,
@@ -1050,6 +1102,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,
@@ -1237,6 +1293,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,
@@ -1245,7 +1305,15 @@ void InitElementProperties()
     EL_PFORTE2X,
     EL_PFORTE3X,
     EL_PFORTE4X,
-    EL_DYNAMIT_AUS,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1X,
+    EL_EM_GATE_2X,
+    EL_EM_GATE_3X,
+    EL_EM_GATE_4X,
+    EL_DYNAMITE_INACTIVE,
     EL_UNSICHTBAR,
     EL_BIRNE_AUS,
     EL_BIRNE_EIN,
@@ -1311,9 +1379,12 @@ void InitElementProperties()
   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,
@@ -1430,6 +1501,56 @@ void InitElementProperties()
   };
   static int ep_sp_element_num = sizeof(ep_sp_element)/sizeof(int);
 
+  static int ep_quick_gate[] =
+  {
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1X,
+    EL_EM_GATE_2X,
+    EL_EM_GATE_3X,
+    EL_EM_GATE_4X,
+    EL_SP_PORT1_LEFT,
+    EL_SP_PORT2_LEFT,
+    EL_SP_PORT1_RIGHT,
+    EL_SP_PORT2_RIGHT,
+    EL_SP_PORT1_UP,
+    EL_SP_PORT2_UP,
+    EL_SP_PORT1_DOWN,
+    EL_SP_PORT2_DOWN,
+    EL_SP_PORT_X,
+    EL_SP_PORT_Y,
+    EL_SP_PORT_XY
+  };
+  static int ep_quick_gate_num = sizeof(ep_quick_gate)/sizeof(int);
+
+  static int ep_over_player[] =
+  {
+    EL_SP_PORT1_LEFT,
+    EL_SP_PORT2_LEFT,
+    EL_SP_PORT1_RIGHT,
+    EL_SP_PORT2_RIGHT,
+    EL_SP_PORT1_UP,
+    EL_SP_PORT2_UP,
+    EL_SP_PORT1_DOWN,
+    EL_SP_PORT2_DOWN,
+    EL_SP_PORT_X,
+    EL_SP_PORT_Y,
+    EL_SP_PORT_XY
+  };
+  static int ep_over_player_num = sizeof(ep_over_player)/sizeof(int);
+
+  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 long ep_bit[] =
   {
     EP_BIT_AMOEBALIVE,
@@ -1459,7 +1580,10 @@ void InitElementProperties()
     EP_BIT_PLAYER,
     EP_BIT_HAS_CONTENT,
     EP_BIT_EATABLE,
-    EP_BIT_SP_ELEMENT
+    EP_BIT_SP_ELEMENT,
+    EP_BIT_QUICK_GATE,
+    EP_BIT_OVER_PLAYER,
+    EP_BIT_ACTIVE_BOMB
   };
   static int *ep_array[] =
   {
@@ -1490,7 +1614,10 @@ void InitElementProperties()
     ep_player,
     ep_has_content,
     ep_eatable,
-    ep_sp_element
+    ep_sp_element,
+    ep_quick_gate,
+    ep_over_player,
+    ep_active_bomb
   };
   static int *ep_num[] =
   {
@@ -1521,7 +1648,10 @@ void InitElementProperties()
     &ep_player_num,
     &ep_has_content_num,
     &ep_eatable_num,
-    &ep_sp_element_num
+    &ep_sp_element_num,
+    &ep_quick_gate_num,
+    &ep_over_player_num,
+    &ep_active_bomb_num
   };
   static int num_properties = sizeof(ep_num)/sizeof(int *);