rnd-20000806-1-src
[rocksndiamonds.git] / src / main.c
index f6439e8fe3487e06deeccef6658d594404657698..7c51c2b6810683cee41230f8c2dc72f1691a2835 100644 (file)
 Display        *display;
 Visual        *visual;
 int            screen;
 Display        *display;
 Visual        *visual;
 int            screen;
-Window         window;
-GC             gc, clip_gc[NUM_PIXMAPS], tile_clip_gc;
-Pixmap         pix[NUM_PIXMAPS];
-Pixmap         clipmask[NUM_PIXMAPS], tile_clipmask[NUM_TILES];
+DrawWindow     window;
+GC             gc, clip_gc[NUM_BITMAPS], tile_clip_gc;
+Bitmap         pix[NUM_BITMAPS];
+Bitmap         pix_masked[NUM_BITMAPS], tile_masked[NUM_TILES];
+Pixmap         clipmask[NUM_BITMAPS], tile_clipmask[NUM_TILES];
 
 #ifdef USE_XPM_LIBRARY
 XpmAttributes  xpm_att[NUM_PICTURES];
 #endif
 
 
 #ifdef USE_XPM_LIBRARY
 XpmAttributes  xpm_att[NUM_PICTURES];
 #endif
 
-Drawable        drawto, drawto_field, backbuffer, fieldbuffer;
+DrawBuffer     drawto, drawto_field, backbuffer, fieldbuffer;
 Colormap       cmap;
 
 int            sound_pipe[2];
 Colormap       cmap;
 
 int            sound_pipe[2];
@@ -84,7 +85,7 @@ short         AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
 unsigned long  Elementeigenschaften1[MAX_ELEMENTS];
 unsigned long  Elementeigenschaften2[MAX_ELEMENTS];
 
 unsigned long  Elementeigenschaften1[MAX_ELEMENTS];
 unsigned long  Elementeigenschaften2[MAX_ELEMENTS];
 
-int            level_nr, leveldir_nr, num_leveldirs;
+int            level_nr;
 int            lev_fieldx,lev_fieldy, scroll_x,scroll_y;
 
 int            FX = SX, FY = SY, ScrollStepSize;
 int            lev_fieldx,lev_fieldy, scroll_x,scroll_y;
 
 int            FX = SX, FY = SY, ScrollStepSize;
@@ -102,7 +103,7 @@ int         FrameCounter, TimeFrames, TimePlayed, TimeLeft;
 
 boolean                network_player_action_received = FALSE;
 
 
 boolean                network_player_action_received = FALSE;
 
-struct LevelDirInfo    leveldir[MAX_LEVDIR_ENTRIES];
+struct LevelDirInfo    *leveldir_first = NULL, *leveldir_current = NULL;
 struct LevelInfo       level;
 struct PlayerInfo      stored_player[MAX_PLAYERS], *local_player = NULL;
 struct HiScore         highscore[MAX_SCORE_ENTRIES];
 struct LevelInfo       level;
 struct PlayerInfo      stored_player[MAX_PLAYERS], *local_player = NULL;
 struct HiScore         highscore[MAX_SCORE_ENTRIES];
@@ -110,8 +111,6 @@ struct SoundInfo    Sound[NUM_SOUNDS];
 struct TapeInfo                tape;
 struct OptionInfo      options;
 struct SetupInfo       setup;
 struct TapeInfo                tape;
 struct OptionInfo      options;
 struct SetupInfo       setup;
-struct SetupFileList   *setup_list = NULL;
-struct SetupFileList   *level_setup_list = NULL;
 struct GameInfo                game;
 struct GlobalInfo      global;
 
 struct GameInfo                game;
 struct GlobalInfo      global;
 
@@ -260,7 +259,7 @@ char *element_info[] =
   "dark yam yam",                              /* 60 */
   "magic wall (BD style)",
   "invisible steel wall",
   "dark yam yam",                              /* 60 */
   "magic wall (BD style)",
   "invisible steel wall",
-  "dynabomb",
+  "-",
   "increases number of bombs",
   "increases explosion size",
   "increases power of explosion",
   "increases number of bombs",
   "increases explosion size",
   "increases power of explosion",
@@ -302,8 +301,8 @@ char *element_info[] =
   "unknown",
   "unknown",
   "unknown",
   "unknown",
   "unknown",
   "unknown",
-  "unknown",
-  "unknown",
+  "normal wall (BD style)",
+  "rock (BD style)",
   "open exit",
   "unknown",
   "amoeba",
   "open exit",
   "unknown",
   "amoeba",
@@ -397,8 +396,8 @@ char *element_info[] =
   "letter ''",
   "letter ''",
   "letter ''",
   "letter ''",
   "letter ''",
   "letter ''",
-  "growing wall (horizontally)",               /* 200 */
-  "growing wall (vertically)",
+  "growing wall (horizontal)",                 /* 200 */
+  "growing wall (vertical)",
   "growing wall (all directions)",
   "unused",
   "unused",
   "growing wall (all directions)",
   "unused",
   "unused",
@@ -428,8 +427,8 @@ char *element_info[] =
   "yellow disk",
   "terminal",
   "red disk",                                  /* 230 */
   "yellow disk",
   "terminal",
   "red disk",                                  /* 230 */
-  "port (vertically)",
-  "port (horizontally)",
+  "port (vertical)",
+  "port (horizontal)",
   "port (all directions)",
   "electron",
   "buggy base",
   "port (all directions)",
   "electron",
   "buggy base",
@@ -463,14 +462,14 @@ char *element_info[] =
   "white door",                                        /* 260 */
   "gray door (opened by white key)",
   "white key",
   "white door",                                        /* 260 */
   "gray door (opened by white key)",
   "white key",
-  "force field (passive)",
+  "shield (passive)",
   "extra time",
   "switch gate (open)",
   "switch gate (closed)",
   "switch for switch gate",
   "switch for switch gate",
   "extra time",
   "switch gate (open)",
   "switch gate (closed)",
   "switch for switch gate",
   "switch for switch gate",
-  "time gate",
-  "time gate with magic wheel",                        /* 270 */
+  "-",
+  "-",                                         /* 270 */
   "red conveyor belt (left)",
   "red conveyor belt (middle)",
   "red conveyor belt (right)",
   "red conveyor belt (left)",
   "red conveyor belt (middle)",
   "red conveyor belt (right)",
@@ -521,12 +520,43 @@ char *element_info[] =
   "dx unknown 42",
   "-",
   "-",                                         /* 320 */
   "dx unknown 42",
   "-",
   "-",                                         /* 320 */
-  "force field (active, kills enemies)",
-  "-",
-  "-",
-  "-",
-  "-",
-  "-",
+  "shield (active, kills enemies)",
+  "time gate (open)",
+  "time gate (closed)",
+  "switch for time gate",
+  "switch for time gate",
+  "balloon",
+  "send balloon to the left",
+  "send balloon to the right",
+  "send balloon up",
+  "send balloon down",                         /* 330 */
+  "send balloon in any direction",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "steel wall",
+  "normal wall",
+  "normal wall",
+  "normal wall",
+  "normal wall",
+  "normal wall",                               /* 340 */
+  "normal wall",
+  "normal wall",
+  "normal wall",
+  "tube (all directions)",
+  "tube (vertical)",
+  "tube (horizontal)",
+  "tube (vertical & left)",
+  "tube (vertical & right)",
+  "tube (horizontal & up)",
+  "tube (horizontal & down)",                  /* 350 */
+  "tube (left & up)",
+  "tube (left & down)",
+  "tube (right & up)",
+  "tube (right & down)",
+  "spring",
+  "trap",
+  "stable bomb (DX style)",
   "-"
 
   /*
   "-"
 
   /*
@@ -534,6 +564,384 @@ char *element_info[] =
   */
 };
 
   */
 };
 
+
+
+/* +-----------------------------------------------------------------------+ */
+/* | SDL TEST STUFF                                                        | */
+/* +-----------------------------------------------------------------------+ */
+
+#ifdef USE_SDL_LIBRARY
+
+SDL_Surface *sdl_screen, *sdl_image_tmp, *sdl_image, *sdl_image_masked;
+SDL_Surface *sdl_image2_tmp, *sdl_image2, *sdl_image2_masked;
+
+void TEST_SDL_BLIT_RECT(int x, int y)
+{
+  SDL_Rect rect_src, rect_dst;
+
+  SDLCopyArea(pix_masked[PIX_HEROES], window,
+             8 * TILEX, 8 * TILEY, TILEX, TILEY, x, y);
+  return;
+
+  rect_src.x = 8 * TILEX;
+  rect_src.y = 8 * TILEY;
+  rect_src.w = TILEX;
+  rect_src.h = TILEY;
+
+  rect_dst.x = x;
+  rect_dst.y = y;
+  rect_dst.w = TILEX;
+  rect_dst.h = TILEY;
+
+  SDL_BlitSurface(sdl_image2_masked, &rect_src, sdl_screen, &rect_dst);
+  SDL_UpdateRect(sdl_screen, x, y, TILEX, TILEY);
+}
+
+void TEST_SDL_INIT_DISPLAY()
+{
+  SDL_Rect rect_src, rect_dst;
+
+  if (SDL_Init(SDL_INIT_VIDEO) < 0)
+  {
+    fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
+    exit(1);
+  }
+
+  /* automatically cleanup SDL stuff after exit() */
+  atexit(SDL_Quit);
+
+  if ((sdl_screen = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, 16, SDL_HWSURFACE))
+      == NULL)
+  {
+    fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
+    exit(1);
+  }
+
+  SDL_WM_SetCaption(WINDOW_TITLE_STRING, WINDOW_TITLE_STRING);
+
+  if ((sdl_image_tmp = IMG_Load("graphics/RocksScreen.pcx")) == NULL)
+  {
+    fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
+    exit(1);
+  }
+
+  sdl_image = SDL_DisplayFormat(sdl_image_tmp);
+
+  SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY,
+                 SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00));
+  sdl_image_masked = SDL_DisplayFormat(sdl_image_tmp);
+
+  SDL_FreeSurface(sdl_image_tmp);
+
+  if ((sdl_image2_tmp = IMG_Load("graphics/RocksHeroes.pcx")) == NULL)
+  {
+    fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
+    exit(1);
+  }
+
+  sdl_image2 = SDL_DisplayFormat(sdl_image2_tmp);
+  SDL_FreeSurface(sdl_image2_tmp);
+
+  sdl_image2_masked = SDL_DisplayFormat(sdl_image2);
+  SDL_SetColorKey(sdl_image2_masked, SDL_SRCCOLORKEY,
+                 SDL_MapRGB(sdl_image2_masked->format, 0x00, 0x00, 0x00));
+
+  rect_src.x = 0;
+  rect_src.y = 0;
+  rect_src.w = sdl_image->w;
+  rect_src.h = sdl_image->h;
+
+  rect_dst.x = 0;
+  rect_dst.y = 0;
+  rect_dst.w = sdl_image->w;
+  rect_dst.h = sdl_image->h;
+                                           
+  SDL_BlitSurface(sdl_image, &rect_src, sdl_screen, &rect_dst);
+
+  /*
+  SDL_UpdateRect(sdl_screen, 0, 0, WIN_XSIZE, WIN_YSIZE);
+  */
+  /*
+  SDL_UpdateRect(sdl_screen, 0, 0, 0, 0);
+  */
+  SDL_Flip(sdl_screen);
+
+  /*
+  SDL_Delay(5000);
+  */
+}
+
+void TEST_SDL_EVENT_LOOP()
+{
+  int quit_loop = 0;
+
+  SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
+
+  /*
+  while (!quit_loop && SDL_WaitEvent(&event) >=0)
+  */
+
+  while (!quit_loop)
+  {
+    SDL_Event event;
+
+    if (SDL_PollEvent(&event))
+    {
+      /* hier werden die Ereignisse behandelt */
+      switch(event.type)
+      {
+        case SDL_QUIT:
+       {
+         quit_loop = 1;
+         break;
+       }
+
+        case SDL_MOUSEBUTTONDOWN:
+       {
+         int x = event.button.x;
+         int y = event.button.y;
+
+         SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
+
+         TEST_SDL_BLIT_RECT(x, y);
+
+         printf("SDL_MOUSEBUTTONDOWN(%d, %d)\n", x, y);
+         break;
+       }
+
+        case SDL_MOUSEBUTTONUP:
+       {
+         int x = event.button.x;
+         int y = event.button.y;
+
+         SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
+
+         printf("SDL_MOUSEBUTTONUP(%d, %d)\n", x, y);
+         break;
+       }
+
+        case SDL_MOUSEMOTION:
+       {
+         int x = event.motion.x;
+         int y = event.motion.y;
+
+         TEST_SDL_BLIT_RECT(x, y);
+
+         printf("SDL_MOUSEMOTION(%d, %d)\n", x, y);
+         break;
+       }
+
+        default:
+         break;
+      }
+    }
+
+    if (!SDL_PollEvent(NULL))  /* delay only if no pending events */
+    {
+      printf("waiting...\n");
+      Delay(100);
+    }
+  }
+
+  SDL_FreeSurface(sdl_image);
+  SDL_Quit();
+}
+
+#define SCREEN_WIDTH   640
+#define SCREEN_HEIGHT  480
+
+void WatchJoysticks()
+{
+       SDL_Surface *screen;
+       const char *name;
+       int i, done;
+       SDL_Event event;
+       int x, y, draw;
+       SDL_Rect axis_area[2];
+       int joystick_nr = 0;
+       SDL_Joystick *joystick = Get_SDL_Joystick(joystick_nr);
+
+       /* Set a video mode to display joystick axis position */
+       screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, 0);
+       if ( screen == NULL ) {
+               fprintf(stderr, "Couldn't set video mode: %s\n",SDL_GetError());
+               return;
+       }
+
+       /* Print info about the joysticks we are watching */
+       for (i=0; i<2; i++)
+       {
+         joystick = Get_SDL_Joystick(i);
+
+         name = SDL_JoystickName(i);
+         printf("Watching joystick %d: (%s)\n", i,
+                name ? name : "Unknown Joystick");
+         printf("Joystick has %d axes, %d hats, %d balls, and %d buttons\n",
+                SDL_JoystickNumAxes(joystick),
+                SDL_JoystickNumHats(joystick),
+                SDL_JoystickNumBalls(joystick),
+                SDL_JoystickNumButtons(joystick));
+       }
+
+       /* Initialize drawing rectangles */
+       memset(axis_area, 0, (sizeof axis_area));
+       draw = 0;
+
+       /* Loop, getting joystick events! */
+       done = 0;
+       while ( ! done ) {
+               while ( SDL_PollEvent(&event) ) {
+                       switch (event.type) {
+                           case SDL_JOYAXISMOTION:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d axis %d value: %d\n",
+                                      event.jaxis.which,
+                                      event.jaxis.axis,
+                                      event.jaxis.value);
+                               break;
+                           case SDL_JOYHATMOTION:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d hat %d value:",
+                                      event.jhat.which,
+                                      event.jhat.hat);
+                               if ( event.jhat.value == SDL_HAT_CENTERED )
+                                       printf(" centered");
+                               if ( event.jhat.value & SDL_HAT_UP )
+                                       printf(" up");
+                               if ( event.jhat.value & SDL_HAT_RIGHT )
+                                       printf(" right");
+                               if ( event.jhat.value & SDL_HAT_DOWN )
+                                       printf(" down");
+                               if ( event.jhat.value & SDL_HAT_LEFT )
+                                       printf(" left");
+                               printf("\n");
+                               break;
+                           case SDL_JOYBALLMOTION:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d ball %d delta: (%d,%d)\n",
+                                      event.jball.which,
+                                      event.jball.ball,
+                                      event.jball.xrel,
+                                      event.jball.yrel);
+                               break;
+                           case SDL_JOYBUTTONDOWN:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d button %d down\n",
+                                      event.jbutton.which,
+                                      event.jbutton.button);
+                               break;
+                           case SDL_JOYBUTTONUP:
+                             joystick_nr = event.jaxis.which;
+                               printf("Joystick %d button %d up\n",
+                                      event.jbutton.which,
+                                      event.jbutton.button);
+                               break;
+                           case SDL_KEYDOWN:
+                               if ( event.key.keysym.sym != SDLK_ESCAPE ) {
+                                       break;
+                               }
+                               /* Fall through to signal quit */
+                           case SDL_QUIT:
+                               done = 1;
+                               break;
+                           default:
+                               break;
+                       }
+               }
+
+               joystick = Get_SDL_Joystick(joystick_nr);               
+
+               /* Update visual joystick state */
+               for ( i=0; i<SDL_JoystickNumButtons(joystick); ++i ) {
+                       SDL_Rect area;
+
+                       area.x = i*34;
+                       area.y = SCREEN_HEIGHT-34;
+                       area.w = 32;
+                       area.h = 32;
+                       if (SDL_JoystickGetButton(joystick, i) == SDL_PRESSED) {
+                               SDL_FillRect(screen, &area, 0xFFFF);
+                       } else {
+                               SDL_FillRect(screen, &area, 0x0000);
+                       }
+                       SDL_UpdateRects(screen, 1, &area);
+               }
+
+               /* Erase previous axes */
+               SDL_FillRect(screen, &axis_area[draw], 0x0000);
+
+               /* Draw the X/Y axis */
+               draw = !draw;
+               x = (((int)SDL_JoystickGetAxis(joystick, 0))+32768);
+               x *= SCREEN_WIDTH;
+               x /= 65535;
+               if ( x < 0 ) {
+                       x = 0;
+               } else
+               if ( x > (SCREEN_WIDTH-16) ) {
+                       x = SCREEN_WIDTH-16;
+               }
+               y = (((int)SDL_JoystickGetAxis(joystick, 1))+32768);
+               y *= SCREEN_HEIGHT;
+               y /= 65535;
+               if ( y < 0 ) {
+                       y = 0;
+               } else
+               if ( y > (SCREEN_HEIGHT-16) ) {
+                       y = SCREEN_HEIGHT-16;
+               }
+               axis_area[draw].x = (Sint16)x;
+               axis_area[draw].y = (Sint16)y;
+               axis_area[draw].w = 16;
+               axis_area[draw].h = 16;
+               SDL_FillRect(screen, &axis_area[draw], 0xFFFF);
+
+               SDL_UpdateRects(screen, 2, axis_area);
+       }
+}
+
+void TEST_SDL_JOYSTICK()
+{
+  const char *name;
+  int i;
+
+  /* Initialize SDL (Note: video is required to start event loop) */
+  if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 )
+  {
+    fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
+    exit(1);
+  }
+
+  /* Print information about the joysticks */
+  printf("There are %d joysticks attached\n", SDL_NumJoysticks());
+  for ( i=0; i<SDL_NumJoysticks(); ++i )
+  {
+    name = SDL_JoystickName(i);
+    printf("Joystick %d: %s\n",i,name ? name : "Unknown Joystick");
+  }
+
+  for (i=0; i<2; i++)
+  {
+    if (!Open_SDL_Joystick(i))
+      printf("Couldn't open joystick %d: %s\n", i, SDL_GetError());
+  }
+
+  WatchJoysticks();
+
+  for (i=0; i<2; i++)
+    Close_SDL_Joystick(i);
+
+  SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
+}
+
+#endif /* USE_SDL_LIBRARY */
+
+/* +-----------------------------------------------------------------------+ */
+/* | SDL TEST STUFF                                                        | */
+/* +-----------------------------------------------------------------------+ */
+
+
+
 int main(int argc, char *argv[])
 {
   program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
 int main(int argc, char *argv[])
 {
   program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
@@ -542,8 +950,22 @@ int main(int argc, char *argv[])
   _fmode = O_BINARY;
 #endif
 
   _fmode = O_BINARY;
 #endif
 
+#if 1
   GetOptions(argv);
   OpenAll(argc,argv);
   GetOptions(argv);
   OpenAll(argc,argv);
+#endif
+
+#if 0
+#ifdef USE_SDL_LIBRARY
+  /*
+  TEST_SDL_BLIT_RECT((WIN_XSIZE - TILEX)/2, (WIN_YSIZE - TILEY)/2);
+  TEST_SDL_EVENT_LOOP();
+  */
+  TEST_SDL_JOYSTICK();
+  exit(0);
+#endif
+#endif
+
   EventLoop();
   CloseAllAndExit(0);
   exit(0);     /* to keep compilers happy */
   EventLoop();
   CloseAllAndExit(0);
   exit(0);     /* to keep compilers happy */